2012年3月29日星期四

equals&&hashCode方法的最佳实践

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也相同,反之不一定成立


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; 
}









没有评论:

发表评论