我想知道为什么在以下代码中:
String args0 = args[0];
String args1 = args[1];
args0.intern();
args1.intern();
if (args0==args1){
System.out.println("Success");
} else {
System.out.println("Failure");
}
通过作为行命令参数传递2个相同的字符串,它返回failure
。
提前致谢。
答案 0 :(得分:4)
由于String
不可变,您需要分配实例intern()
返回,以使变量引用实例化实例,以便==
比较返回{ {1}}。
true
在您的示例String args0 = args[0];
String args1 = args[1];
args0 = args0.intern();
args1 = args1.intern();
if (args0==args1){
System.out.println("Success");
} else {
System.out.println("Failure");
}
中,args0
仍然引用数组中的原始不同实例。
答案 1 :(得分:1)
你必须这样做:
if (args0.intern() == args1.intern()){
System.out.println("Success");
}
答案 2 :(得分:0)
字符串不可变。
.intern()
返回实习池中的(可能)不同的 String实例。
你扔掉了这个实例。
答案 3 :(得分:0)
Java自动实习字符串文字。这意味着在许多情况下,==运算符似乎适用于字符串,就像它对整数或其他原始值一样。
由于对于字符串文字是自动的,因此intern()
方法将用于使用new String()
构造的字符串。
您也可以参考此示例:
public class Test
{
public static void main(String args[]){
String Str1 = new String("Welcome to Tutorialspoint.com");
String Str2 = new String("WELCOME TO SUTORIALSPOINT.COM");
System.out.print("Canonical representation:" );
System.out.println(Str1.intern());
System.out.print("Canonical representation:" );
System.out.println(Str2.intern());
}
}
答案 4 :(得分:0)
(我假设args0
和args1
持有具有相同值的字符串)
args0.intern()
将检查字符串池是否已包含与args0
中的字符串具有相同值的字符串。 args0
具有相同值的新String,将其放置在池引用中返回。 后
args0.intern();
args1.intern();
args0
和args1
仍然保留命令行中使用的字符串,因此它们与池中的字符串不同。
要改变它,请尝试
args0 = args0.intern();
args1 = args1.intern();
现在args0 = args0.intern();
会将args0
中的“put”字符串放在池更新args0
中以保存该字符串。 args1 = args1.intern();
实习生将看到该池包含相同的字符串(之前放置args0.intern()
),因此只返回对它的引用并将其存储在args1
下。
现在if(args0 == args1)
应为true
,因为两个引用都是相同的String对象。
答案 5 :(得分:0)
字符串是不可变的,其方法总是返回已更改的String
:
args0 = args0.intern();
args1 = args1.intern();