Java 中 hashCode 和 equals 方法是什么?它们与 == 操作符有什么区别?

📅 发布时间:2026/7/13 5:42:23 👁️ 浏览次数:
Java 中 hashCode 和 equals 方法是什么?它们与 == 操作符有什么区别?
Java 中 hashCode 和 equals 方法详解1. equals 方法equals()方法用于判断两个对象是否逻辑相等。默认实现// Object 类中的默认实现publicbooleanequals(Objectobj){return(thisobj);}重写 equals 的规范Overridepublicbooleanequals(Objectobj){// 1. 自反性x.equals(x) 必须返回 true// 2. 对称性x.equals(y) 和 y.equals(x) 结果必须一致// 3. 传递性x.equals(y) y.equals(z) 则 x.equals(z)// 4. 一致性多次调用结果一致// 5. 非空性x.equals(null) 必须返回 falseif(thisobj)returntrue;// 引用相同if(objnull||getClass()!obj.getClass())returnfalse;MyClassother(MyClass)obj;returnObjects.equals(field,other.field);}2. hashCode 方法hashCode()返回对象的哈希码整数用于哈希表HashMap、HashSet 等快速定位对象。重要规则一致性多次调用 hashCode() 应返回相同整数对象未修改时equals 相等则 hashCode 相等如果a.equals(b)为 true则a.hashCode() b.hashCode()hashCode 相等不一定 equals 相等哈希冲突是允许的重写 hashCode 示例OverridepublicinthashCode(){returnObjects.hash(field1,field2,field3);}3. 操作符是引用比较判断两个对象的内存地址是否相同。Strings1newString(hello);Strings2newString(hello);System.out.println(s1s2);// false不同对象System.out.println(s1.equals(s2));// true内容相同4. 三者对比特性equals()hashCode()比较内容内存地址逻辑内容哈希值Object 默认引用比较引用比较内存地址转换可重写不可可可返回类型booleanbooleanint主要用途判断是否同一对象判断内容是否相等哈希表索引5. 实际应用示例publicclassPerson{privateStringname;privateintage;Overridepublicbooleanequals(Objectobj){if(thisobj)returntrue;if(objnull||getClass()!obj.getClass())returnfalse;Personperson(Person)obj;returnageperson.ageObjects.equals(name,person.name);}OverridepublicinthashCode(){returnObjects.hash(name,age);}}// 使用示例Personp1newPerson(张三,25);Personp2newPerson(张三,25);System.out.println(p1p2);// falseSystem.out.println(p1.equals(p2));// trueSystem.out.println(p1.hashCode()p2.hashCode());// true// 在 HashSet 中使用SetPersonsetnewHashSet();set.add(p1);set.add(p2);// 不会重复添加因为 equals 相等System.out.println(set.size());// 16. 关键要点必须同时重写重写equals()时必须重写hashCode()哈希表依赖HashMap、HashSet 等集合依赖这两个方法String 类已重写这两个方法比较字符串内容包装类Integer、Long 等也已重写性能考虑hashCode 计算应快速且分布均匀理解这三个概念对于正确使用 Java 集合框架和编写健壮的代码至关重要