字符串的intern()方法

时间:2014-05-18 07:36:38

标签: java string

我从intern()方法看到了下面的行为,困惑,有什么想法吗?

案例1:

 String test3=new String("hello");  
 test3.intern();   
 String test4=new String("hello");   
 test4.intern();  
 if(test3==test4){   
    System.out.println("same obj refered for test3 and test4 ");  
 }  
 else{   
    System.out.println("new obj created for test4");   
 }  

输出:

new obj created for test4

案例2:

String test3=new String("hello").intern();   
//test3.intern();   
String test4=new String("hello").intern();   
//test4.intern();       
if(test3==test4){   
   System.out.println("same obj referred for test3 and test4 ");    
}
else{   
   System.out.println("new obj created for test4");    
}    

输出:

same obj referred for test3 and test4

2 个答案:

答案 0 :(得分:4)

在CASE1中,您忽略了intern的返回值。这就是为什么变量仍然包含对原始字符串对象的引用。

要了解最新情况,请考虑以下代码

    String test1 = "hello";
    String test2 = new String(test1);
    String test3 = test2.intern();
    System.out.println(test1 == test2);
    System.out.println(test1 == test3);

打印

false
true

test1是字符串池中分配的字符串文字"hello"test2是一个新的字符串对象,与test1不同,但具有相同的字符内容。它在堆上分配。 test3intern的结果,因为字符串池中已经存在字符串"hello",我们只返回对它的引用。因此test3引用与test1相同的对象。

答案 1 :(得分:-1)

这是因为intern()方法返回一个interned String,它将指向实习池中的String实例而不是堆中的String实例。 If the String instance to be interned is already in the pool, reference to it is returned. If not then the String is added to the pool and reference to it is returned.因此,您应该比较实习方法返回的字符串,而不是原始引用。