为什么重写了equals方法必须重写hashCode方法

看到一个公众号解释这个问题又是画图又是讲故事的,成功把很多人带蒙了。看完以后我都有些怀疑之前的认识了,重新理一遍。
首先看看Object默认实现的equals方法

    public boolean equals(Object obj) {
        return (this == obj);
    }

使用==号,来判断传入的参数和自己是不是同一个内存地址。
如果不重写equals,那么不同的对象使用equals来比较返回的是false,因为内存地址的指向不同。
重写了equals,自己人为的改变对象equals方法比较的条件,可以让内存地址不同的对象,使用equals方法在符合自定义条件的时候返回true。
举例 有个User类,有no和age属性,现在只要no相等,就认为是同一个人,equals比较返回true,重写equals方法如下

class User{
 int no;
 int age;

  public boolean equals(Object obj) {
      return (this.no == obj.no);
    }
}

这样两个user对象使用equals方法,只要no相等,就返回true,认为他们是同一个人。
这样做有问题吗?如果不使用Set 或Map等散列表结构去存储user对象,是没有问题的。但是如果是用散列表结构比如HashMap,就会有问题。
现在有2个User对象,user1和user2,no都是1,age随意。重写了equals方法如上例。不重写hashCode方法。
使用一个HashMap map 存储

map.put(user1,1)
map.put(user2,2)

这里使用user做key。现在我用map.get(user1)得到的结果是什么呢?
预知后事如何
且听下回分解

你可能感兴趣的:(为什么重写了equals方法必须重写hashCode方法)