2013-03-15 80 views
5

所有, 我遇到一个问题,当一个写下面一个关于Java字符串文字池中,并串的串联混乱

String hello = "Hello"; 
String str5 = "Hel" + "lo"; 
String str8 = "Hel"; 
String str9 = "lo"; 
String str10 = str8 + str9; 
System.out.println("str10==hello?" + (str10 == hello)); 
System.out.println("str5==hello?" + (str5 == hello)); 
System.out.println("str10==str5?" + (str10 == str5)); 

然后我跑我的代码,并在控制台打印代码这个

str10 == hello ? false 
str5 == hello ? true 
str10 == str5 ? false 

这使我困惑不已。为什么第二次打印TRUE但第一次打印FALSE? 在我理解的字符串文字池中,当定义一个字符串时,JVM将检查该池是否包含该字符串,如果没有,则将该字符串放入池中。
在我的代码,可变你好存在串池,” 直升机‘和’LO‘也是在游泳池,我的问题是

  1. 如果’直升机拼接的结果“和”lo“存在于池中。
  2. 关于str5和str10s的定义和它们为什么不是“==”有什么区别? ?不STR5和str10指有多种不同的“你好”,在字符串池(‘==’似乎意味着引用是同一个对象)

我的JDK版本:1.6.0_29
我IDE:IntelliJ IDEA的11.2

任何人都可以指出来非常感谢你

回答

7

它的行为,因为它应该它是在JLS的两个部分不客气

JLS #3.10.5:。

作为常量表达式(§15.28)的值的字符串 - 使用方法String.intern“共享”以便共享唯一实例。

JLS #15.28列出了什么被认为是一个常量表达式。特别是,字符串文字是常量表达式(“Hel”和“lo”),但是对于一个被认为是常量的变量,它需要是最终的。

在你的情况,如果你改变你的代码稍微做str8str9不变,你会得到true三次:

final String str8 = "Hel"; 
final String str9 = "lo"; 
+0

谢谢你!这对我很有帮助 – fuye 2013-03-15 10:58:51

-1

如果妳比较两个字符串使用string.equalsstring1 == string2

试试吧:

System.out.println("str10==hello?" + (str10.equals(hello)); 
+0

是的,正如我们在String equals源代码中看到的那样,首先检查(this == anObject){return true;},然后判断它是否是String的实例,如果是,则比较内容两个字符串对象。 – fuye 2013-03-15 10:53:25

0

该代码有以下几点考虑:

String hello = "Hello"; 

这里的“Hello”是分配给参考你好从而字面有它自己的哈希码文字

String str5 = "Hel" + "lo"; 

这里“赫尔” +“LO”是2个文字组合并分配给参考你好从而新的文字是相同的第一个,因此相同的散列码

String str8 = "Hel"; 
String str9 = "lo"; 

这里STR8 + STR9是2名的引用,其结合并指向一个新的参考你好从而新的文字有它自己的哈希码

String str10 = str8 + str9; 
System.out.println("str10==hello?" + (str10 == hello)); 
System.out.println("str5==hello?" + (str5 == hello)); 
System.out.println("str10==str5?" + (str10 == str5)); 

当您使用==它通过散列码和值匹配。从而失配。

尝试使用

string_1.equals(STRING_2)

代替

STRING_1 == STRING_2

,您将获得价值仅匹配。因此,所有真

请同时参阅下面的答案(来自What is the difference between == vs equals() in Java?):

的equals()方法比较“值” String实例内侧(堆)无关如果两个(2)对象的引用指到相同的字符串实例或不。如果任何两个(2)类型为String的对象引用指向相同的String实例,那么太棒了!如果两(2)个对象引用引用了两(2)个不同的String实例,那么它没有区别。它是每个正在比较的字符串实例中的“值”(即:字符数组的内容)。

另一方面,“==”运算符比较两个对象引用的值,以查看它们是否引用相同的String实例。如果两个对象引用的值“引用”相同的String实例,那么布尔表达式的结果将为“true”.. duh。另一方面,如果两个对象引用的值“引用”不同的String实例(即使两个String实例具有相同的“值”,即每个String实例的字符数组的内容相同),布尔表达式的结果将是“false”。

+1

对不起,我不明白“使用==它匹配哈希码和值”,
我打印str5,str8,str9,str10的每个哈希码是hello.hash-> 69609650; str8.hash-> 72431; str9.hash-> 3459; str10.hash-> 69609650; str5.hash-> 69609650;我们可以看到,str5,str10的hashcode完全相同,但str5 == str10返回false; – fuye 2013-03-15 10:34:07

+0

请检查编辑答案 – 2013-03-15 11:29:23

+0

感谢您花时间写这this.this弄清楚“==”和“等于”之间的混淆。非常感谢 – fuye 2013-03-20 06:52:20

0
String hello = "Hello";  // at compile time string is known so in String Constant Pool 

String str5 = "Hel" + "lo"; // at compile time string is known so in String Constant Pool same object as in variable hello 

String str8 = "Hel";   // at compile time string is known so in String Constant Pool 

String str9 = "lo";   // at compile time string is known so in String Constant Pool 

String str10 = str8 + str9; // at runtime don't know values of str8 and str9 so in String Constant Pool new object different from variable hello 

str10 == hello ? false  // as str10 has new object and not the same as in hello 

str5 == hello ? true   // both were created at compile time so compiler know what's the result in str5 and referenced the same object to str5 as in hello 

str10 == str5 ? false   // str10 is a different object, hello and str5 are referenced same object as created at compile time.