Set的使用

       java中的set是一种不可重复,无序的集合。主要有HashSet,TreeSet,和EnumSet。其中HashSet最为经常使用。

     HashSet

     当试图向hashset中加入元素时,hashset首先会计算元素的hashcode值,并且判断该元素是否和其他对象相等(相等的标准是用equals方法比较相等,且hashcode值相等,两项中的一项不相等,即认为不相等)。如果没有和其他元素相等,那么就根据hashcode的值决定其在hashset中的存储位置。

     这个判断相等的条件会带来一些问题,比如两个对象,利用equals比较返回相等,但是hashcode值不相等,那么hashset会将这两个对象加到hashset中的不同位置。这与hashset不能加入相同对象的原则显然有些出入。

    如果两个对象利用equals方法比较返回false,但是hashcode值相等,这将更加麻烦。因为hashcode值相等,hashset试图把他们放在同一个存储空间中,但是又不行,因为这将覆盖原来的对象,所以hashset只能将一个桶的位置里放入了多个对象。因为hashset是用hashcode的值来检索数据的,所以这种情况会给其检索数据带来麻烦,导致其效率降低。

     所以,当我们往hashset中加入对象的时候,应该有一个原则,即对象通过equals方法返回true时,他们的hashcode值也应相等。hashcode的值可以根据equals中比较的属性的hashcode值进行叠加。

     LinkHashSet

     LinkHashSet是hashset的子类,其使用了链表来保存元素的插入顺序,当我们遍历集合时,输出的元素是按照插入顺序输出的。linkhashset的效率比hashset低,但是迭代访问集合中的元素时,他的效率比hashset高,因为他保存了元素之间的顺序。

     TreeSet

     TreeSet中保存的元素都是有序的,即我们如果希望保存有序的集合时,可以使用TreeSet。同样TreeSet中也不能保存重复的元素,重复的定义是使用equals方法返回true,且使用compareTo方法返回0。TreeSet是用红黑树算法来存储元素,如果两个对象使用compareTo方法返回0,那么TreeSet认为他们应该存储在同一个位置。

     当我们往treeset中插入对象时,应该保证该对象所属的类实现了comparable接口,因为treeset是有序,他必须有判断元素大小的方法,即我们应该compareTo方法。

    EnumSet

    EnumSet是专门为枚举类型设置的集合,EnumSet中所有的元素都必须是枚举类型的值,他使用枚举在其对应的enum类中定义的顺序来决定在集合中的顺序。EnumSet使用位向量的方式进行存储,所以非常高效,紧凑,节约了内存空间。特别是进行批量操作时,他的效率特别高效。

    


你可能感兴趣的:(java,算法,equals,存储)