什么情况需要重写equals? 如何重写equals和hashCode

一、需要重写的情况

       加入到HashSet中的自定义类对象,为确保他们不重复,需要对他们的类重写equals() 和 hashcode()的方法。

       如果不重写equals() 方法,相同的内容不同引用的对象会被当做不同的对象被加入到hashset中

      例如:自定义的类 User  参数值完全一致的情况下 

                 User user1 = new User("张三","上海");

                 User user2 = new User("张三","上海");

                 Set(User) set = new HashSet();

                 set.add(user1);

                 set.add(user2);

                 //不重写equals() 和 hashcode()

                 set集合中存了两个值  set.size()  == 2

                 //重写

                 set集合中存了一个值  set.size()  == 1

                

        注意:1、重写equals必须重写hashCode方法  因为是先比较两个对象的hash值是否相等在判断值         

                   2、equals() 和 hashCode() 的定义必须兼容 如果 x.equals(y) 则x , y 的hashCode必须相等,

                   3、x , y 的 hashCode相等,x , y 不一定相等

二、重写equals() 和  hashcode() 方法

       1、重写equals()

       1)判断比较对象 object 是否等于自身

             if(object == this) return true;

        2)判断比较对象object是否是目标类型的对象 例如 User

             if(!(object instanceof  User)) return false;

        3)类型转换成目标对象  比较 自定的字段 是否相等   全部字段都要进行比较

             User u = (User)object;

             return u.name.equals(name) && u.age == age;

         2、重写hashCode

             public int hashCode(){

                 int result = 17;

                 result = result *31 + name.hashCode();

                 result = result*31 + age;

              return result;

           }

posted @ 2017-10-11 10:33  孙宝路  阅读(2572)  评论(0编辑  收藏  举报