Java集合-Set

来源:互联网 发布:商业网络 编辑:程序博客网 时间:2024/06/08 07:50

Set集合
Set集合有三个比较常用的实现类,分别为HashSet、LinkedHashSet、TreeSet。其中HashSet集合中元素顺序是不能保证的,LinkedHashSet通过一个链表来维护元素的顺序,TreeSet可以按照自然排序或者自定义排序对集合中的元素进行排序。

  • HashSet

    HashSet底层应该是使用Hash算法来决定对象的存放位置。HashSet中每个能存储对象的“槽位”称为“桶”。由于Hash函数具有单向性,所以通过HashCode()方法的返回值,可以立即定位到对象存放的位置,因此存取速度是比较快的。我们知道,在Set集合中对象是不能重复的,那么HashSet中如何才算是同一个对象呢?HashSet中存放对象的原理是,当我们要往HashSet中存放对象时,首先根据HashCode()方法计算出对象存储的地址,然后再通过equals()函数比较是否和已有对象相等。这里会出现几种情况:
    1.两个对象的hashCode()值相等,但是equals()不为真
    2.两个对象的hashCode()不相等,但是equals()为真
    3.两个对象的hashCode()值相等,equals()也返回为真
    当出现情况1时,就需要在“桶”中存放多个元素,这样就会导致性能的下降。当出现情况2时,两个对象分别放在不同的“桶”中。当出现情况3时,说明两个对象相等了,不能往集合中存放这个对象了。所以总结一下HashSet集合判断对象相等的标准是hashCode()的值相等,equals()为真。

  • LinkedHashSet
    LinkedHashSet的和HashSet基本相似,只是它通过一个链表来维护元素放入集合的顺序。其对象判断相等的标准和HashSet一致。

  • TreeSet
    TreeSet可以保证集合元素处于排序状态。TreeSet存放元素的的原理根据红黑树来进行存储。TreeSet元素有两种排序方式,一种是自然排序,如果对象想要进行自然排序,则对象对应的类必须实现Comparable接口。另一种是定制排序,这个需要在创建TreeSet对象的时候,传入一个Comparator对象实现对对象的定制排序。
    在向TreeSet中添加对象的时候,只能添加同一类对象。同时TreeSet中判断对象相等的标准是compareTo()方法返回0或者定制排序中的compare()方法返回0.

  • EnumSet
    EnumSet是一个比较特殊的Set集合,它的集合元素只能是enum类中定义的对象。同时集合元素的顺序和它在enum类中的定义是一样的。EnumSet类是抽象的,因此只能通过它的类方法来创建对象。
    EnumSet的方法如下:

EnumSet.noneOf(Class elementType);
EnumSet.allOf(Class elementType);
EnumSet.range(Class elementType);