【问题标题】:What is the logic behind == returning false [toString()] when two reference variables are referring to same Object having same hashCode? [duplicate]当两个引用变量引用具有相同 hashCode 的同一个对象时,== 返回 false [toString()] 背后的逻辑是什么? [复制]
【发布时间】:2021-08-24 05:01:18
【问题描述】:

当两个引用变量引用具有相同哈希码值的同一个对象时,== 返回 false 背后的逻辑是什么?

public class One {  
    public static void main(String[] args) {        
        One o = new One();
        One o1 = o; 
        System.out.println(o.toString());                                       
        System.out.println(o1.toString());                                      
        System.out.println(o.hashCode());                                       
        System.out.println(o1.hashCode());                                      
        
        // Why does it print false ?
        System.out.println(o.toString()==o1.toString());    // false                    
        System.out.println(o.hashCode()==o1.hashCode());    // true                 
        System.out.println(o.equals(o1));                   // true
                            
        System.out.println(o.toString().hashCode()==o.toString().hashCode());   // true 
    }
}

【问题讨论】:

    标签: java equals tostring hashcode object-class


    【解决方案1】:

    一行

    System.out.println(o.toString()==o1.toString());    // false  
    

    有一个toString()。每个toString() 都会创建一个新的字符串对象,它们是不同的对象,有自己的内存位置。所以==实际上检查了这些新字符串对象之间的内存地址。

    始终将字符串与String#equals 进行比较,而不是与==

    【讨论】:

    • 好答案。您可能想要添加提及 hashCode 返回一个 int,它作为一个原语在比较参考与比较值时没有问题。相比之下,toString 返回 String 涉及引用,因为 String 是一个对象,而不是一个原语。换句话说,解释为什么o.hashCode()==o1.hashCode() 不是问题而o.toString()==o1.toString() 是问题。
    • @Basil Bourque 我是初学者,请见谅。打印 o 和 o1 的 RV 会导致相同的输出,即 HEX 格式的对象的完全限定名称@hashCode 值。当 o 和 o1 打印相同的输出时,怎么会是假的?
    • 字符串的内容是一样的,但是每个toString()都会为字符串生成一个新的内存位置。然后由于字符串是一个对象,使用== 比较引用(内存位置)而不是字符串的内容。
    【解决方案2】:

    == 符号检查被比较对象的内存地址。在您的情况下,toString() 方法会创建两个不同的 String 对象,这些对象存储在两个不同的位置。这就是为什么当您尝试比较它们时会得到false
    另一方面,equals() 检查对象内容的相等性。对于您自己的数据类型,您应该重写此方法以使用它。
    hashCode 是对象的内容 的某种唯一标识号。也就是说,相等的对象必须返回相同的hashCode。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      相关资源
      最近更新 更多