我尝试了以下课程:
public class EqualMethodTestWithNew {
public static void main(String[] args) {
String value = "xxx";
String name = new String("xxx") ;
System.out.println("hascode : value : "+value.hashCode());
System.out.println("hascode : name : "+name.hashCode());
if (value == name) {
System.out.println("equal == 1");
} else {
System.out.println("false == 1");
}
}
}
尽管两个变量的hasCode相同,但它打印false == 1
。有人可以解释原因吗?
感谢
答案 0 :(得分:1)
字符串应与equals()
方法进行比较,而不是==
。您正在尝试检查两个实例的内存地址(实际上它们不是)的相等性,而不是String实例中的值。所以,使用
if(value.equals(name)) {
System.out.println("equal == 1");
}
答案 1 :(得分:1)
您应该使用equals
方法而不是==
运算符。
if (value.equals(name)) {
System.out.println("equal == 1");
} else {
System.out.println("false == 1");
}
请注意:
== tests for reference equality.
.equals() tests for value equality.
有关详细信息,请参阅here。
答案 2 :(得分:1)
您的代码无效的原因是==
测试对象的引用是否相同,而不是您的情况。要比较字符串的值,您需要使用.equals(String str)
方法。
if (value.equals(name)) {
...
}
答案 3 :(得分:1)
执行2个字符串语句时,您需要了解到底发生了什么。
String value = "xxx";
上面的行创建了一个新的编译时常量字符串,它在String intern pool。
中 String name = new String("xxx") ;
但在这种情况下,由于您正在使用new
运算符,因此它会创建一个新的String对象,该对象位于对象堆中。它与前一个语句中创建的地址不同。
hashCode()
方法基于String的内容是相同的,但这并不意味着它们都引用内存中相同的String对象。
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] // would return same value for all String objects having the same content
要比较这些值,您需要使用equals()
方法。
如果要比较对象引用,请使用==
运算符。在您的情况下,由于两者都引用差异对象,因此输出为false
。
或者,您可以要求编译器使用intern()
方法检查并获取字符串池中已存在的相同值的String的引用。
String value = "xxx";
String name = new String("xxx");
name = name.intern(); // getting reference from string pool
现在,当您执行equal == 1
时,您将获得if (value == name) {
的输出。
答案 4 :(得分:0)
使用equal()方法比较字符串。 ==比较两个对象是否相等。