0
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作为输出。如果使用equals()而不是“==”,它会返回 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:真

为什么使用带有类名的“==”进行黑白字符串比较会发生矛盾(如果比较字符串名称用作类名)?

4

4 回答 4

4

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

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

于 2013-10-29T08:40:00.503 回答
3

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

str = str.intern();
于 2013-10-29T08:33:06.870 回答
0

补充答案,这里有一篇关于实习生()的好文章

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

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

于 2013-10-29T08:36:52.403 回答
-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.

所以你必须分配返回值 Egstring = string.intern();

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

于 2013-10-29T08:35:58.820 回答