什么是equals方法?在Java中,equals方法用于判断两个对象是否相等。该方法使用起来非常简单:a.equals(b),返回真或假。Object中equals方法源码publicbooleanequals(Objectobj){return(this==obj);}为什么要从object的继承中重写equals方法?equals只是判断两个对象的内存地址是否相同,这样的代码,没办法满足大部分情况,所以如果新类需要使用equals方法,就需要重写equals方法。重写equals方法需要遵循的规范1.自反性:对于任何非空引用x,x.equals(x)应该返回true。2.对称性:对于任何对x和y的引用,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。3.传递性:对于任何对x、y和z的引用,如果x.equals(y)返回true而y.equals(z)返回true,那么x.equals(z)也应该返回true。4.一致性:如果x和y引用的对象没有改变,重复调用x.equals(y)应该返回相同的结果。5.非空性:对于任何非空引用x,x.equals(null)应该返回false。equals和hashCode必须在每个覆盖equals方法的类中覆盖hashCode。如果不这样做,就会违反hashCode的一般契约。equals和hashCode都是用来判断两个对象是否相等的。不同的是:equals——保证比较对象是否绝对相等hashCode——保证两个对象在最快的时间内相等,hashMap中可能存在错误值在put方法中,首先找到根据hashcode对应的下标。如果下标对应的链表中已经存在数据,则逐条遍历链表,遍历时使用equals判断是否为同一个对象。如果找到相同的对象,则执行更新操作,如果没有找到,则执行插入操作。假设有两个equals为真,但是hashCode不同的key加入到同一个hashMap中。因为hashCode不同,所以它们计算出的下标概率不同(差异概率大于93%)。我们继续假设他们的下标计算方式不同,那么当存入第二个key时,因为检测到另一个list,找不到第一个key的存在,所以会进行插入操作。这样造成的问题是在同一个hashMap中,同一个key(equals是同一个),但是有两份数据。
