我的错题集 更新中
Java:==、equals() 与 hashCode()(HashMap) 我的理解偏差 把 == 只理解成“比较引用地址” 这只适用于引用类型。 对基本数据类型,== 比较的是值。 对引用类型,== 判断两个引用是否指向同一个对象。 把 equals() 说成“判断是不是同一个对象” 更准确的说法是:equals() 用于判断两个对象是否“逻辑相等”。 两个不同的对象,也完全可以因为业务字段相同而 equals() == true。 把 hashCode() 理解成可以直接定位到某个对象 hashCode() 主要用于散列查找,帮助 HashMap 快速缩小查找范围、定位桶。 不同对象可能拥有相同的 hashCode,因此 hashCode 不能唯一确定一个对象。 HashMap 找到桶后,还需要通过 equals() 进一步确认 key。 “重写 equals 必须重写 hashCode”的关键原因没有说完整 Java 约定:如果 a.equals(b) == true,则必须保证 a.hashCode() == b.hashCode()。 在 HashMap 中,如果两个逻辑相等的 key 因为 hashCode 不同被定位到不同的桶,那么查找时连 equals() 都可能没有机会执行,最终导致本应相等的 key 查找失败。 核心记忆 hashCode() 负责“找桶”,equals() 负责“认人”。 如果 equals() 相等但 hashCode() 不同,两者可能被放进不同的桶,甚至没有机会进行 equals() 比较。 ...