为什么intern方法在java中不返回相等的String

时间:2014-08-16 15:25:24

标签: java

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

4 个答案:

答案 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)

String.intern 返回一个新的实习字符串。要更改s1s2,请执行

s1 = s1.intern();
s2 = s2.intern();
然后

s1 == s2将返回true。

答案 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)为假。

相关问题