为什么classname与使用“==”的实习字符串比较相矛盾?

时间:2013-10-29 08:31:03

标签: java classname string-interning

class helloworld
{
   public static void main(String args[]) {
       String str1="hello";
       String str2="world";
       String str=str1+str2;
       str.intern();
       System.out.println(str=="helloworld");
   }
}  

o / p:false

执行程序后,它会生成 false 作为输出。如果使用等于()而不是“==”,则返回true。为什么呢?

2.在这种情况下,在更改类名后,它会生成 true 作为输出。

class main
{
   public static void main(String args[]) {
       String str1="hello";
       String str2="world";
       String str=str1+str2;
       str.intern();
       System.out.println(str=="helloworld");
  }
} 

O / P:真

为什么发生矛盾b / w使用“==”与classname进行内部字符串比较(如果比较字符串名称用作类名)?

4 个答案:

答案 0 :(得分:4)

原因是在第一个示例中,字符串"helloworld"已经在字符串池中,因为它是类的名称。因此实习它不会向字符串池添加任何内容。因此str不是实习值,比较将是假的。

在第二个示例中,str.intern()实际上将str添加到字符串池中,因为"helloworld"尚未存在。然后,当遇到"helloworld"文字时,实际使用的字符串对象是字符串池中的字符串对象。那只是str,所以比较是真的。

答案 1 :(得分:3)

String是不可变的。您必须使用str.intern()的返回值。只需调用str.intern()并忽略返回值就什么都不做。

str = str.intern();

答案 2 :(得分:0)

补充答案,这里有关于实习生()

的好文章

英语:https://weblogs.java.net/blog/2006/06/26/all-about-intern

俄语:http://habrahabr.ru/post/79913/

答案 3 :(得分:-1)

不可变对象中的字符串。并且根据javadoc

的intern()函数
When the intern method is invoked, if the pool already contains a
string equal to this <code>String</code> object as determined by
the {@link #equals(Object)} method, then the string from the pool is
returned. Otherwise, this <code>String</code> object is added to the
pool and a reference to this <code>String</code> object is returned.

因此,您必须指定返回值Eg string = string.intern();

至于你的输出它应该是true而不管你的类名,因为如上所述,它与调用intern()无关。