0

我真的对字符串池感到困惑

在这种情况下将创建多少个对象

String a=new String("Hi"); //1
String b=new String("Hi"); //2
String c="hi"; //3

如果在第二个和第三个字符串的情况下正在创建一个对象,那么为什么它在 (a==b) 的情况下返回 FALSE ....

4

4 回答 4

4

为什么在 (a==b) 的情况下返回 FALSE

因为您正在使用因此为那些snew String获取新的对象引用。String

请注意,将代码更改为

String a = "Hi"; //1
String b = "Hi"; //2

将进行System.out.println(a == b);打印true

进一步解释:字符串池

于 2013-06-10T06:48:50.287 回答
2

在 Java 中,对于非原始类型,==运算符比较引用,而不是值。

如果您创建一堆等效的字符串文字,例如:

String sLit1 = "test";
String sLit2 = "test";

(sLit1 == sLit2)will be true,因为 Java 不会为每个新的 String 文字分配新的内存,它只是将它们都指向内存中的相同位置。但是,当您创建 String 对象时:

String sObj = new String("test") 

Java 总是创建一个新对象,它在内存中占据一个新位置。sLit1 == sObj将永远如此false

这意味着当且仅当两个参数引用同一个对象时才会==产生。true要比较字符串,请使用equals方法,如(sObj.equals(sLit1)).

于 2013-06-10T06:53:40.983 回答
1

它不是一个对象,您正在使用 new 关键字创建字符串,因此 jvm 在堆中创建这些字符串,因此两个对象的地址不同。

并且 == 检查对象地址,这就是它返回错误的原因。

如果是字符串 c="hi";

这不是使用 new 创建的,因此这些文字在字符串池中创建。jvm 在这些文字上存在实习过程。

如果还有一个 String d="hi"; 然后 c==d 将返回 true。

于 2013-06-10T06:53:28.170 回答
0

这里,

String c = "Hi"; 

将在字符串文字池中创建字符串文字,该池是为 java 中的字符串文字提供的单独内存。当你写

String c = "Hi";
String d = "Hi";

它们将在字符串常量池中引用相同的文字。和 == 运算符检查引用变量是否引用同一个对象

因此,c == d 将返回 true。

于 2013-06-10T06:54:39.160 回答