public static void main (String[] args) {
String s1 = new String("hello");
String s2 = new String("hello");
s1.intern();
s2.intern();
System.out.println(s1 == s2); // why this returns false ?
}
根据我的理解,第一次调用实习方法应该创建一个带有单个字符串"hello"
的“字符串实习池”。第二次调用实习方法没有做任何事情(因为"hello"
字符串已经存在于池中)。现在,当我说s1 == s2
时,我希望JVM比较字符串实习池中的"hello"
字符串并返回true
。
答案 0 :(得分:4)
您只是检查引用堆中不同对象的原始字符串。 您没有存储String#intern()方法的返回值。
应该是
String s1 = new String("hello");
String s2 = new String("hello");
String s11 = s1.intern();
String s22 = s2.intern();
System.out.println(s11 == s22); // returns true
答案 1 :(得分:4)
intern()
方法不修改字符串,只需返回字符串池中的相应字符串。因此,由于您未保留返回值,因此您对intern()
的调用毫无意义。但是,如果您实际使用它们,您会发现它们都指向完全相同的字符串:
public static void main (String[] args) {
String s1 = new String("hello");
String s2 = new String("hello");
s1 = s1.intern();
s2 = s2.intern();
System.out.println(s1 == s2); // will print true
}
答案 2 :(得分:3)
答案 3 :(得分:1)
它实际上是在调用这些方法后需要赋值的字符串属性,即使在以下情况下也可以举例:
String S1= "Hello";
S1.concat("World");
如果您打印S1的值,它将只打印“Hello”。但如果你这样写:
S1=S1.concat(" World");
然后它将打印“Hello World”。
同样,您需要将值指定为:
s1=s1.intern();
s2=s2.intern();
如果你比较s1 == s2它将返回真值但是,让我们说:
String s3=s1.intern();
String s4=s2.intern();
如果比较s3 == s4则其为true但(s3 == s1)和(s4 == s2)为假。