equals和hashCode书写原则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36336003/article/details/83076539

equals:

  1. 判断this对象与anObject对象是否相等(this == anObject
  2. 判断anObject对象是否为类或其子类对象(anObject instanceof String
  3. 比较类中属性是否相等
      基本类型,直接使用==判断
      集合数组类型,遍历集合数组使用相应equals方法判断
      引用数据类型,使用相应equals方法判断
  4. 重写equals方法是总要重写hashCode方法(Always override hashCode when you override equals)

如String类的equals方法:

// java.lang.String#equals
public boolean equals(Object anObject) {
	  if (this == anObject) {
	       return true;
	   }
	   if (anObject instanceof String) {
	       String anotherString = (String)anObject;
	       int n = value.length;
	       if (n == anotherString.value.length) {
	           char v1[] = value;
	           char v2[] = anotherString.value;
	           int i = 0;
	           while (n-- != 0) {
	               if (v1[i] != v2[i])
	                   return false;
	               i++;
	           }
	           return true;
	       }
	   }
	   return false;
}


hashCode:

  1. 定义int类型变量hashCode并赋值1(int hashCode = 1;
  2. 对于每个成员变量,进行如下计算hash code c(根据字段类型):
    boolean:  (f ? 1 : 0)
    byte, char, short, int: (int) f
    long: (int) (f ^ (f >>> 32))
    float: Float.floatToIntBits(f)
    double: Double.doubleToLongBits(f)
    Object: (obj==null ? 0 : obj.hashCode())
  3. 对每个字段进行如下操作: hashCode = 31 * hashCode + c;
  4. 返回hashCode(return hashCode;)
//java.util.AbstractList#hashCode
public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}

猜你喜欢

转载自blog.csdn.net/qq_36336003/article/details/83076539