2015-05-15 59 views
1
String s1 = "learn"; 
String s1 = s1+"Java"; 

现在s1指向"learnJava"字符串是否正确?两个字符串应该相等吗?

String s2 = "learnJava"; 

if(s1 == s2)是错误的。为什么?

s2应指向与已存在于StringConstantPool(s1)中相同的"learnJava"

+6

你为什么改变问题的琴弦?这立即使我的答案没有用,但并没有让你的问题更好... –

+0

非常感谢你回答乔恩。其实我想编辑字符串文字,我编辑它而没有看到你的答案。 –

回答

11

s2应指向与StringConstantPool中已存在的相同的“learnJava”。

都能跟得上 - 字符串池中仅用于不断字符串,除非你叫intern

因此字符串池包含"learn""Java""learnJava" ...但s1指串字符串池中没有,因为串接在执行时进行。

如果你有一个编译时间常数表达式,这将是不同的:

String s1 = "learn" + "Java"; // Constant expression 
String s2 = "learnJava"; 
System.out.println(s1 == s2); // true, guaranteed 

或者,如果你想保持你的执行时间串联:

String s1 = "learn"; 
s1 += "Java"; 
s1 = s1.intern(); 
String s2 = "learnJava"; 
System.out.println(s1 == s2); // true 

虽然在一般,只是不要将字符串与==比较......这几乎总是一个坏主意。

+0

所以在这种情况下's1'不是指字符串池。 's2'是指字符串池吗? – hitz

+0

@hitz:'s1'的* first *值是对池中一个入口的引用 - 但是第二个不是,因为它是串联的结果。但是,在所有这些情况下's2'指向字符串池中的一个值,因为它是用编译时常量表达式初始化的。 –

+0

所以,如果我们做's1.intern();'这意味着堆中有两个相同的字符串,其他的在池中? – codegasmer

0

这也是我想到的问题。
一个char: 'a' 是原始
一个性质:新字符( 'A')是一个对象
的字符串:! “a” 是一个对象
之所以说 “learnJava”= “learnJava”是他们是不同的对象。
因此,为了检查,如果两个字符串相等,你要做的:

String s1 = "learnJava"; 
String s2 = "learnJava"; 
s1.equals(s2) > true 
相关问题