繁体   English   中英

Java中==的奇怪行为

[英]strange behavior of == in Java

我在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等于:

不打印

帮助我解决这个问题

提前致谢,

拉吉

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

有关Java中运算符优先级的表,请参见http://bmanolov.free.fr/javaoperators.php

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

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

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

注意括号的新位置。

因为+与=相比具有更高的优先级,并且如果你使用括号(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

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

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

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

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

当且仅当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类equals方法。

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

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

str1.equals(str2)返回true因为equals()函数比较字符串变量的内容,其中as ==运算符比较实例。 由于str1str2String类的两个实例差异,因此返回false

在Java中==操作符匹配的两个对象,即他们的地址,而.equals()方法符合项目两个对象的值,这就是为什么你得到trueequals()false==因为它们都是不同的对象。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM