link1,link2,link3,link4,link5,link6
主要是为了提升哈希表的性能。因为HashMap 集合类使用了 hashCode() 方法来计算对象在哈希表中应该存储的位置,如果不重写hashcode值一样的对象。因为new出来的对象即使值相同,存储地址必不相同。不重写 hashCode会导致为值相同的对象分别了两个存储空间,导致了空间浪费。因此要重写。
以下是关于hashcode的一些性质:
两个对象相等,hashcode一定相等
两个对象不等,hashcode不一定不等
hashcode相等,两个对象不一定相等
hashcode不等,两个对象一定不等
重写hashCode遵循的五个条件
在改写equals方法时,也要遵守他们的通用约定(equals方法实现了等价关系):
\1. 自反性:x.equals(x) = true;
\2. 对称性:如果有x.equals(y) = true,那么一定有y.equals(x) = true;
\3. 传递性:对任意的x,y,z。如果有x.equals(y) = y.equals(z) = true,那么一定有x.equals(z)= true;
\4. 一致性:无论多少次调用,x.equals(y)总会返回相同的结果。
\5. 非空性(暂定):所有的对象都必须!=null;
上面的只是理论性的说法,更加具体的做法如下:
\1. 使用==操作符检查“实参是否为指向对象的一个引用”,如果是则返回true;
\2. 使用instanceof操作符检查“实参是否为正确的类型”,如果不是,则返回false;
\3. 将实参装换为正确的类型;
\4. 对于该类中的每一个关键域,检查实参中的域与当前对象中对应的域是否匹配。如果所有测试都成功,则返回true,否则返回false。
\5. 方法完成之后,确定equals方法的对称性,传递性,一致性