Java中==的奇怪行为

5

我发现了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打印仅为false。

我尝试在eclipse和NetBeans中编译,但结果相同。我很困惑,不知道为什么

使用==比较str1和str2,结果没有被打印

请帮我解决这个问题

提前致谢,

Raj


你尝试过将条件封装在括号中吗?第一个条件可能会被添加到你的字符串中,然后与str2一起评估。 - Josh
2
"使用 == str1 和 str2 相等:" + str1 == str2 将等同于 "使用 == str1 和 str2 相等:" + "Rajesh" == "Rajesh"。因为 + 的优先级高于 ==(2 + 2 == 4),我们将得到 "使用 == str1 和 str2 相等:Rajesh" == "Rajesh" 的等价式,这将是 false。 - Tom Hawtin - tackline
1
可能是Java String.equals versus ==的重复问题。 - Michael Petrotta
@Josh 很好的评论,非常感谢你。 - Raj
当您不使用任何括号时,== 运算符最后被评估。 - Sam Dufel
10个回答

12

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


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));

请注意括号的新位置。

4
因为“+”符号比“=”符号的优先级更高,如果你使用括号(str1 == str2)那么结果会返回true,因为最高优先级是括号。 所以首先它会检查数据内部的括号。
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

2
也许是操作顺序的问题?尝试一下这个:
System.out.println("Using == str1 and str2 Equals :" + (str1 == str2));

2

尝试像这样用()将其括起来:

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

它运行良好并打印出以下内容:使用 == str1 和 str2 相等 :true。该说明由@Ademiban提供。 - Kuldeep Jain

0

如果x和y引用同一对象,则equals方法返回true。以下是Object类实现equals方法的代码。

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 类的 equals 方法。


-1
原因是在Java中,不能使用 == 比较字符串。
在C++或C#(或其他支持运算符重定义的语言)中,您可以重写 == 运算符以提供该功能。但Java不支持这样做。

1
你的意思是重载(overload),而不是覆盖(overwrite)或者重写(override)。在Java中,你可以使用==比较字符串引用。它将比较引用而不是对象,但如果在这种特定情况下正确使用,那么这将很好地工作。 - Jon Skeet
是的,我的意思是重载。谢谢你指出那个引用的事情。我之前不知道。 - Abrixas2

-1

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


2
这里,str1str2将是相同的字符串引用,因为语言处理编译时字符串常量的方式。 - Jon Skeet

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

-2

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


2
它比较的是值,但这些值是引用。当它也可以用于测试引用相等性时,说 == 只能用于比较原始数据类型 是不正确的。在这种情况下,由于我们正在处理相同字符串常量的两个实例,如果使用正确,== 将正常工作。 - Jon Skeet
请记住,绝大多数对象都不会覆盖equals方法,而只是返回==的结果。我经常看到人们犯的一个相当普遍的错误是假设“我使用了.equals,所以这将起作用”。 - Affe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接