集合set中元素判重以及hashcode的实现过程

TreeSet引出的Set元素判重方法

TreeSetset中的数据元素必须实现Comparable,必须重写compareTo()方法(而不是equals())。

HashSet:比较set中元素的hashCode方式判断是否是重复的元素,故必须重写hashCode。与HashMap相同,重hashCode()时注意,当元素的一些属性发生变化时,不能改变hashCode 的值,防止一个元素数据在修改了某些属性时,hashCode改变,从而在HashSetHashMap中能放置多次,或是无法获取。

Java.util.concurrent.CopyOnWriteArraySet:线程安全,用元素的equals()方法判断重复。

Java.util.Listcontains()方法调用的是元素数据的equals()方法。

 

 

看到网上一个hashcode的实现非常不错,特在此作为记录。

n  如何写hashCode

n  1.  把某个非零常数值,比如17保存在一个叫resultint型变量中;

n  2.  对于对象中的每一个关键域f,完成下列步骤:

n  a. 为该域计算int类型的散列码c

   i.   fboolean,计算(f ? 0 : 1);

   ii.  fbytecharshortint,计算(intf

   iii. flong,计算(int)(f ^ (f>>>32))

   iv. ffloat,计算Float.floatToIntBits(f)

   v.  fdouble,计算Double.doubleToLongBits(f),对结果执行2.a.iii

   vi. f为对象引用,引用为null,返回0,否则递归调用hashCode

   vii.f为一个数组,对每个元素当作单独域递归调用上述规则.

         b.  按照下面的公式,把步骤a中计算得到的散列码c组合到result中。

                   result = 37 * result + c;

         3.  返回result

         4.  写完hashCode后,检查”是否相等的实例有相等的散列码”,不是的话,予以    修改

 

你可能感兴趣的:(HashCode)