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进行内部字符串比较(如果比较字符串名称用作类名)?
答案 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
答案 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()无关。