original link->
equals&&hashCode是一对孪生方法,使用集合(Collection such as Set, List or Map)需要将自定义类作为键值(key)时,需要了解这哥俩,在自定义类中它俩一般要同时重写。
equals的最佳实践:
1.反身性(Reflexive) o.equals(o)
2.对称性(Symmetric)o1.equals(o2) <=> o2.equals(o1) ,o1,o2类型要相同
3.传递性(Transitive) o1.equals(o2) && o2.equals(o3) =>o1.equals(o3)
4.一致性(Consistent) 只要o1,o2没有变,o1.equals(o2) 始终成立
5.null和任何对象不等,!o1.equals(null)
6.o1.equals(o2) => o1.hashCode() == o2.hashCode() ,equals/hashCode方法要一起重写且含有相同的识别属性,对象相等hashCode也相同,反之不一定成立
equals&&hashCode是一对孪生方法,使用集合(Collection such as Set, List or Map)需要将自定义类作为键值(key)时,需要了解这哥俩,在自定义类中它俩一般要同时重写。
equals的最佳实践:
1.反身性(Reflexive) o.equals(o)
2.对称性(Symmetric)o1.equals(o2) <=> o2.equals(o1) ,o1,o2类型要相同
3.传递性(Transitive) o1.equals(o2) && o2.equals(o3) =>o1.equals(o3)
4.一致性(Consistent) 只要o1,o2没有变,o1.equals(o2) 始终成立
5.null和任何对象不等,!o1.equals(null)
6.o1.equals(o2) => o1.hashCode() == o2.hashCode() ,equals/hashCode方法要一起重写且含有相同的识别属性,对象相等hashCode也相同,反之不一定成立
hashCode的最佳实践:
1.一个对象的hashCode必须始终保持不变
2.对象相等hashCode相同,一个属性[没]被用于判别是否equals,也必须[没]用于计算hashCode,反之亦然。
3.不等的对象可能返回相同的hashCode(撞衫了,囧)
public class Pet {
int id;
String name;
public boolean equals(Object obj){
if(this == obj) return true; // if both are referring to the same object
if ((obj == null) || (obj.getClass() != this.getClass())) {
return false;
}
Pet rhs = (Pet) obj;
return id == rhs.id&&(name == rhs.name ||
(name != null&&name.equals(rhs.name)) );
}
public int hashCode() {
int hash = 9;
hash = (31 * hash) + id;
hash = (31 * hash) + (null == name ? 0 : name.hashCode());
return hash;
}
}
没有评论:
发表评论