Java中的字符串何时是不同的对象?

时间:2014-06-30 08:11:35

标签: java string memory-management string-comparison

我最近在Java中了解到:==比较对象引用,而不是内容,这就是原因:

String str1 = "hell";
String str2 = "o";
String str3 = str1 + str2;
String str4 = "hello";

str3 == str4; // False

到目前为止一切顺利。但是,当我执行以下操作时:

String str5 = "hello";
str5 == str4; // True

这是否意味着str5和str4引用相同的内存对象?这是如何工作的?

7 个答案:

答案 0 :(得分:6)

String str5 = "hello";创建字符串值hello,这就是str5 == str4返回true的原因。

另一方面,str1 + str2的工作原理如下:

更多信息:

答案 1 :(得分:3)

是。 str5str4引用相同的内存对象。由于字符串在更改某些字符串的值时是不可变的,因此它会生成不同的对象。如果两个String对象具有相同的值,则不创建第二个,JVM只给出第一个对象的引用。

当String的值改变了为某些安全性和其他有用目的而创建的不同对象时,请阅读以下链接:

Immutability of Strings

wiki Immutable object

创建某些字符串时

String str1="hello";

当您再次尝试创建具有相同值的字符串

时,JVM会创建一个不可变对象
String str2="hello" 

JVM使用相同的过程创建一个对象,因为已经创建了该对象,然后它返回str1的对象以减少重复的对象创建。 这将非常有用string pool in the jvm

答案 2 :(得分:1)

是的,当您创建并分配一个字符串值,例如String s1="hello";时,它将被添加到字符串池中。现在,如果您将相同的String值分配给另一个引用,如下所示: -

String s2="hello";

变量s2将指向相同的String对象hello,存在于String池中。

但是,您可以强制并为相同的值创建一个新的String对象,如下所示: -

String s3= new String("hello");

这将为hello添加和创建新对象,即使它已存在于字符串池中。

因此可以概括为: -

s1==s2; //return true
s1==s3; //return false
s2==s3; //returns false

答案 3 :(得分:0)

字符串在创建后由JVM汇集,这就是为什么这些变量引用字符串池中的同一个实例。

拥有字符串池的想法是避免不必要的对象创建。

答案 4 :(得分:0)

字符串是不可变对象。这就是str1str2组合不等于str3

的原因

答案 5 :(得分:0)

Ya,它为str5 == str4 becoz提供了它使用“字符串池区域”来存储。“这次也是它 比较对象引用“但这些字符串具有相同的对象引用,因为字符串池区域有一个对象id。 在第一种情况下,字符串池区域中没有创建字符串,这就是为什么它给出错误。

答案 6 :(得分:0)

字符串文字的私有池由String类维护。在程序启动期间,所有文字字符串和字符串值常量表达式都将添加到此池中。因此,具有相同值的所有字符串文字都将指向同一个对象。

当创建新的字符串对象时(例如,通过连接两个字符串对象),它不属于字符串池,因此将其与另一个字符串文字进行比较将返回 false 。可以通过在该字符串对象上调用 intern()方法将任何字符串对象添加到字符串池中,现在该对象将指向池中与该对象具有相同值的字符串文字。现在,此对象与相同字符串文字的任何字符串比较都将产生 true