两个引用指向同一对象且hashCode相同时,toString用==比较返回false的逻辑是什么
Java同实例toString()用
==比较返回false的原因分析 核心前提:Java中==的比较规则
- 对基本数据类型:
==比较的是变量存储的实际值 - 对引用数据类型:
==比较的是对象的内存地址,也就是判断两个引用是否指向堆中的同一个对象,不会比较对象的实际内容
现象解释
你观察到的结果完全符合Java的底层实现逻辑,原因如下:
1. 为什么o.hashCode() == o1.hashCode()和o.equals(o1)返回true
o和o1指向堆中的同一个One类实例,Object类的默认hashCode()是根据对象内存地址计算的,同一个实例的hashCode必然相同;而默认equals()的实现本质就是return this == obj,自然也返回true。
2. 为什么o.toString() == o1.toString()返回false
Object类的默认toString()实现逻辑如下:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
每次调用toString()时,字符串拼接操作都会生成一个全新的String对象返回。哪怕两次调用得到的字符串内容完全一致,这两个String对象是堆中独立的两个实例,内存地址完全不同,用==比较地址自然返回false。
3. 为什么o.toString().hashCode() == o1.toString().hashCode()返回true
String类重写了hashCode()方法,是根据字符串的内容计算哈希值:只要两个字符串的字符序列完全一致,哈希值就一定相同,和String对象本身的内存地址无关,所以这里返回true。
注意:如果需要比较字符串的内容是否相等,请使用
str1.equals(str2)方法,不要用==。
内容的提问来源于stack exchange,提问作者missing.hashcode
相关产品推荐
相关产品推荐

