1

==当两个引用变量引用具有相同哈希码值的同一个对象时,返回 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 
    }
}
4

2 回答 2

2

该行与

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

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

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

于 2021-08-24T05:10:23.403 回答
1

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

于 2021-08-24T06:53:28.443 回答