基础补充

hashcode 修改的使用时机:

      在每改写equals方法,就要改写hashcode方法。如果不改写的话,会导致该类无法与所有基于散列值(hash)的集合类结合在一起正常工作,这样的集合包括hashMap,hashSet和hashtable.

      如果我们定义的类不会和java集合类产生关系,那么我们完全没有必要在重写equals()方法的时候来重写hashcode()方法。但出于规范,还是最好用ide直接生成。

编写hashcode的方法:

     

  1. 把某个非零常数值(如17)保存在一个叫result的int类型的变量中;
  2. 对于对象中每个关键字域f(指equals方法中考虑的每一个域),完成以下步骤:
    1. 为该域计算int类型的散列码c:
      1. 如果该域是bloolean类型,则计算(f?0:1)
      2. 如果该域是byte,char,short或int类型,则计算(int)f
      3. 如果该域是long类型,则计算(int)(f^(>>>32))
      4. 如果该域是float类型,则计算Float.floatToIntBits(f)
      5. 如果该域是double类型,则计算Double.doubleToLongBits(f)得一long类型值,然后按前述计算此long类型的散列值
      6. 如果该域是一个对象引用,则利用此对象的hashCode,如果域的值为null,则返回0
      7. 如果该域是一个数组,则对每一个数组元素当作单独的域来处理,然后安下一步的方案来进行合成


    2. 利用下面的公式将散列码c 组合到result中。

              result=37*result+c;

 

hashMap 与  hashtable:判断key是否相同的条件都是hashcode()相同&&满足equals() 。

 

 

 

 

你可能感兴趣的:(基础)