`

equals()和hashcode()总结(一)

阅读更多
1、任何class如果覆写了equals()方法,就必须覆写hashCode()。

2. map是根据equals()和hashCode()来判断对象是否相等,所以在类里覆写了equals(),就一定要覆写hashCode()。
   关于Hashtable,判断key是否相同的条件是:hashCode()相同 && 满足equals(),而一个类如果没有覆写equals()方法,
   那么这个类的equals方法比较的是对象的内存地址。如果没有覆写HashCode,那么该类的hashCode是通过对象的内存地址转换而来.

3. 在程序执行期间,同一个对象调用hashCode()必须返回同一个值(同一个应用执行期)。
   散列码不必是独一无二的(应该更关注生成速度,而不是唯一性),但是通过hashCode()和equals(),
   必须完全能够确定对象。

4. 如果两个对象equals,那么他们的hashCode()必须相等。

5. Map.put(key,value)时根据key.hashCode生成一个内部hash值,根据这个hash值将对象存放在一个table中。
   Map.get(key)会比较key.hashCode和equals方法,当且仅当这两者相等时,才能正确定位到table;
   java中Set是通过Map实现的,所以Map和Set的所有实现类都要注意这一点.

6. 如果想判断是否两个对象引用指向同一个实体,唯一的正确途径是使用==,因为只有它不会被重构,要慎用hashCode。

7. 有一点我们应该是能够确认的,就是同样的数字转换成hashCode后的值肯定一样,
   因此我们在覆写hashCode时候应该利用自己编写的类独特属性进行hashCode运算(当然不仅仅是一个属性,可以是多个属性),
   这样我们就可以尽量的保证每个类对象的具有不同的hashCode,如果这些不同的对象有机会进入同一个map的时候就可以保证其hashCode不一样,
   从而提高map的检索。

8. 有关hashCode()计算
   
   boolean                                    c=(f ? 0 : 1)

   byte,char,short, int                       c=(int)f

   long                                       c=(int)(f^(f>>>32))

   float                                      c=Float.floatToIntBits(f);

   double                                     long l = Double.doubleToLongBits(f);
                                              c=(int)(l^(l>>>32))

   Object                                     c=f.hashCode()

//
int f = 17;
result = 37*result + c;
1
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics