Java中==的奇怪行为

时间:2012-02-09 06:13:03

标签: java string boolean equals

我在java中发现了一个奇怪的行为==运算符。我正在尝试打印输出如下

String str1 = "Rajesh";
String str2 = "Rajesh";
System.out.println("Using equals() str1 and str2 Equals :"
            + str1.equals(str2));
System.out.println("Using == str1 and str2 Equals :" 
            + str1 == str2);

第一个SOP声明打印

  

使用equals()str1和str2等于:true

并且下一个SOP打印仅为假。

我尝试在eclipse和Net Beans中进行编译,但结果是一样的。 我很困惑为什么

  

使用== str1和str2等于:

未打印

帮助我解决这个问题

提前致谢,

拉​​吉

10 个答案:

答案 0 :(得分:12)

它与("Using == str1 and str2 Equals :" + str1) == str2相同,当然这是错误的。表达式从左到右进行解析,因此首先它连接"Using == str1 and str2 Equals :"str1,然后应用==运算符。

答案 1 :(得分:7)

请参阅http://bmanolov.free.fr/javaoperators.php以获取Java中的运算符优先级表。

+运算符的优先级高于==运算符。

因此,实际上,您的代码等同于以下内容:

System.out.println( ("Using == str1 and str2 Equals :" + str1) == str2);

请注意我添加的括号的位置。它评估如下:

System.out.println( (str_x + str1) == str2);

然后到此:

System.out.println( str_y == str2 );

然后到此:

System.out.println( false );

为了获得您想要的结果,您必须使用括号指定您希望在+运算符之前解析==运算符:

System.out.println( "Using == str1 and str2 Equals :" + (str1 == str2));

注意括号的新位置。

答案 2 :(得分:4)

因为+与=相比具有更高的优先级,并且如果你使用括号(str1 == str2)那么  这个结果是真的,因为最高优先级是(。 首先,它检查数据中的括号。

String str1 = "Rajesh";
        String str2 = "Rajesh";
        System.out.println("Using equals() str1 and str2 Equals :"
                + str1.equals(str2));
        System.out.println("Using == str1 and str2 Equals :" 
                + (str1 == str2));

输出:

Using equals() str1 and str2 Equals :true
Using == str1 and str2 Equals :true

答案 3 :(得分:2)

也许是一个操作订单的事情?尝试:

System.out.println("Using == str1 and str2 Equals :" + (str1 == str2));

答案 4 :(得分:2)

尝试使用()这样包围它:

System.out.println("Using == str1 and str2 Equals :" + (str1 == str2));

答案 5 :(得分:0)

当且仅当x和y引用同一个对象时,

equals方法返回true.Follwoing是equals方法的Object类实现。

public boolean equals(Object obj) {
    return (this == obj);
    }

在String类中,此方法已被覆盖如下。

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    } 

如果使用==运算符,则只检查两个引用是否具有相同的对象。类似于Object class equals方法。

答案 6 :(得分:-1)

原因是您无法使用==来比较Java中的字符串。

在C ++或C#(或支持运算符重定义的其他语言)中,您可以覆盖==运算符以提供该功能。 Java不支持。

答案 7 :(得分:-1)

str1.equals(str2)返回true,因为equals()函数会比较字符串变量的内容,而==运算符会比较实例。由于str1str2String类实例的两个不同之处,因此会返回false

答案 8 :(得分:-1)

在Java ==运算符中匹配两个对象,即它们的地址,而.equals()方法会计算两个对象的值,这就是为什么true equals()false {1}} ==因为两者都是不同的对象。

答案 9 :(得分:-2)

==只能用于比较原始数据类型。要比较对象,您需要使用equals方法。在对象上使用==运算符实际上会比较它们的地址而不是值。