• equals()和hashCode()必须同时覆盖的原因


    我们在用JAVA创建自己的类的时候,一种比较常见的覆盖就是覆盖Object中的equals()方法和hashCode()方法。如果不这样做的话,就很可能违反Object.hashCode()的通用约定,从而在利用自己建的类构建需要Hash化的集合的正常工作。其中有一条约定很重要:

    如果两个对象利用equals方法比较是相等的,那么这两个对象必须能返回同样的hashCode。

    这一点很好理解,就比如拿Set来说,Set的特点就是元素是无须的且不可重复。那么这里面所谓的重复的定义,就是需要程序员通过equals去定义的,既然你覆盖了equals()方法,那么也就是你已经定义了重复的概念。那么如果equals()返回了True就意味着hashCode()必须返回一样的散列码。

    比如说:

    1         User u1 = new User(1, "mike");  
    2         User u2 = new User(1, "mike");  
    3         Set<User> set = new HashSet();  
    4         set.add(u1);  
    5         set.add(u2);  
    6         System.out.println(u1.equals(u2));  
    7         for (User u : set) {  
    8             System.out.println(u.getId() + u.getName());  
    9         }      

    会有三种情况:

    1.如果User类中equals()方法和hashCode()都没覆盖,返回false,set中有两个User对象;

    2.如果User类中只覆盖了equals()方法,返回true,set中有两个User对象;

    3.如果User类中同时覆盖了equals()和hashCode()方法,返回true,set中有一个User对象;

    可以看出:如果只覆盖了equals()方法,比较两个User对象是否相等时返回了true,但是set中有两个重复的User对象。这会导致在使用HashSet对象的时候出现问题。

  • 相关阅读:
    vue+axios实现文件下载
    处理 Vue 单页面应用 SEO
    JSON.parse()与JSON.stringify()的区别
    JS设置Cookie过期时间
    <div>标签仿<textarea>。contentEditable=‘true’,赋予非表单标签内容可以编辑
    CSS上下左右居中的几种方法
    jqGrid 修改单元格值或者替换图片及其他
    对于Web性能优化, 了解和经验
    初步了解反射案列
    JS IndexOf移除符合规则的一项
  • 原文地址:https://www.cnblogs.com/Ericzya/p/7794431.html
Copyright © 2020-2023  润新知