String s1 = "learn";
String s1 = s1+"Java";
现在s1指向"learnJava"
字符串是否正确?两个字符串应该相等吗?
String s2 = "learnJava";
if(s1 == s2)
是错误的。为什么?
s2
应指向与已存在于StringConstantPool(s1)中相同的"learnJava"
。
String s1 = "learn";
String s1 = s1+"Java";
现在s1指向"learnJava"
字符串是否正确?两个字符串应该相等吗?
String s2 = "learnJava";
if(s1 == s2)
是错误的。为什么?
s2
应指向与已存在于StringConstantPool(s1)中相同的"learnJava"
。
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
虽然在一般,只是不要将字符串与==
比较......这几乎总是一个坏主意。
所以在这种情况下's1'不是指字符串池。 's2'是指字符串池吗? – hitz
@hitz:'s1'的* first *值是对池中一个入口的引用 - 但是第二个不是,因为它是串联的结果。但是,在所有这些情况下's2'指向字符串池中的一个值,因为它是用编译时常量表达式初始化的。 –
所以,如果我们做's1.intern();'这意味着堆中有两个相同的字符串,其他的在池中? – codegasmer
这也是我想到的问题。
一个char: 'a' 是原始
一个性质:新字符( 'A')是一个对象
的字符串:! “a” 是一个对象
之所以说 “learnJava”= “learnJava”是他们是不同的对象。
因此,为了检查,如果两个字符串相等,你要做的:
String s1 = "learnJava";
String s2 = "learnJava";
s1.equals(s2) > true
你为什么改变问题的琴弦?这立即使我的答案没有用,但并没有让你的问题更好... –
非常感谢你回答乔恩。其实我想编辑字符串文字,我编辑它而没有看到你的答案。 –