Java中怎么重写equals和hashCode

其他教程   发布日期:2025年04月21日   浏览次数:181

这篇文章主要介绍“Java中怎么重写equals和hashCode”,在日常操作中,相信很多人在Java中怎么重写equals和hashCode问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中怎么重写equals和hashCode”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Java中为什么重写equals()也需要重写hashCode()

所有类默认继承Object类 先看一下Object源码

  1. package java.lang;
  2. public class Object {
  3. //默认调用本地的hashcode()方法 根据内存地址生成hash值 避免不了哈希冲突
  4. public native int hashCode();
  5. //默认调用的equals方法比较的是'=='比较
  6. //基本类型比较的是两者的值是否相同 而引用类型比较两者的是引用地址(对象)是否相同
  7. public boolean equals(Object obj) {
  8. return (this == obj);
  9. }
  10. }
  • equals()返回结果为true hashCode()一定相同

  • '=='结果为true hashCode()一定相同

  • '=='结果为false hashCode()有可能相同(哈希冲突)

hashCode()重写规范就是保证equals()相同的两个对象拥有相同的哈希值

回到刚刚哪个问题 为什么重写equals还要重写hashCode()?

  1. 关注公众号:Java技术迷,获取java相关书籍!
  2. public class per {
  3. private String name;
  4. private int age;
  5. public per(String name, int age) {
  6. this.name = name;
  7. this.age = age;
  8. }
  9. public boolean equals(Object o){
  10. if (this==o)return true;
  11. if (o==null||o.getClass()!=this.getClass())return false;
  12. per o1 = (per) o;
  13. return o1.name==name&&o1.name!=null&&o1.name.equals(this.name)&&age=o1.age;
  14. }
  15. public int hashCode(){
  16. return Objects.hash(name,age);
  17. }
  18. /*
  19. 这是Object类中的规范如果不同时重写将会导致很多类库出现业务不一致!
  20. 例如HashMap无法保证key值'唯一性'
  21. 下面测试代码p1和p2虽然地址不同 但是业务上看内容是相同的
  22. 所以应该只用一个key表示 但是不重写将无法正确插入!
  23. */
  24. }
  25. class Example{
  26. public static void main(String[] args) {
  27. per p1 = new per("张三", 18);
  28. per p2 = new per("张三", 18);
  29. HashMap<per,Integer> map = new HashMap<>();
  30. map.put(p1,1);
  31. map.put(p2,2); //具体原理可以看put(k,v)源码!
  32. }
  33. }

以上就是Java中怎么重写equals和hashCode的详细内容,更多关于Java中怎么重写equals和hashCode的资料请关注九品源码其它相关文章!