You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个引用指向同一对象且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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:00:01