java中的字符串比较没有给出期望的结果

时间:2014-01-09 07:26:36

标签: java string comparison equals

我尝试了以下课程:

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。有人可以解释原因吗?

感谢

5 个答案:

答案 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()方法比较字符串。 ==比较两个对象是否相等。