Java中的Set集合

一、Set集合体系

二、HashSet
Hash算法请见: www.jianshu.com/p/bf1d7eee2…
   (1)HashSet特点:

  • HashSet集合以Hash算法存储元素,具有很好的存取和查找功能
  • HashSet不是同步的,也就是说当多个线程同时访问一个HashSet时,必须通过代码实现同步
  • HashSet可以添加null
  • HashSet判断两个元素相同的标准是equals()方法和hashCode()判断结果统一

从结果可以看出当添加的元素的equals()与集合中的其他元素比较时,若返回true且它们的hashCode()的值相同,则添加不成功


三、 LinkedHashSet

LinkedHashSet与HashSet的区别是,它会使用链表记录元素被添加的位置,在遍历集合时效率更高。


四、 TreeSet

TreeSet是SortedSet接口的实现类,它会将所添加元素排序后进行存储。排序方式可以是自然排序,也可以是定制排序。它内部使用红黑树结构存储元素。
另外它额外添加了如下方法:

  • Object first();返回集合中的第一个元素
  • Object last();返回集合中的最后一个元素
  • Object lower(Object e);返回集合中位于e之前的元素(e可以是非集合内元素)
  • Object higher(Object e);返回集合中位于e之后的元素(e可以是非集合内元素)
  • SortedSet subSet(Object from,Object to);返回范围从from(包含)到to(不包含)的Set集合的子集
  • SortedSet headSet(Object to);返回此Set集合的子集,由小于to的元素组成
  • SortedSet tailSet(Object from);返回此Set集合的子集,由大于from的元素组成
  • Cpmparator comparator();如果TreeSet采用了定制排序,则此方法返回定制排序所用的Comparator,否则返回null。


方法展示:

注意:添加到TreeSer集合中的元素必须已经实现了Comparable接口(有一个compareTo(Object obj)方法),且所添加的元素属于同一个类。否则,运行时会报异常

(1)TreeSet中的自然排序
Java语言中以实现Comparable接口的类如下:

  • BigDecimal、BigInteger和所有的数值类的包装类
  • Character类
  • String类
  • Date、Time类
  • Boolean类


默认按升序排列
(2)TreeSet中的定制排序
要实现TreeSet的定制排序,需要在d定义TreeSer时提供一个Comparable(函数式接口,可接受Lambda表达式)对象与该集合关联。

五、EnumSet

EnumSet是一个保存枚举类的枚举值的集合,其内部以位相量的形式存储,进行批量操作时执行速度快。(containsAll()、retainAll())
EnumSet不可以保存null值,且没有暴露构造器实例化。可通过一下方法创建实例:

  • EnumSet allOf(Class enumClass);包含指定枚举类的所有枚举值
  • EnumSet complementOf(EnumSet s);包含枚举类中没有被s包含的枚举值
  • EnumSet copyOf(Collection c);以一个普通集合创建EnumSet对象
  • EnumSet noneOf(Class elementType);创建一个元素类型指定为枚举类型的空集合
  • EnumSet of(E first...E last);创建一个包含指定枚举值的枚举集合
  • EnumSet range(E from, E to);同上

六、Set集合总结
     HashSet(Hash算法存储集合元素)和TreeSet是Set集合的典型实现,HashSet的添加、查询效率高,但是需要对集合中的元素排序则使用TreeSet(红黑树存储集合元素)。LinkedHashSet(Hash算法存储集合元素,外加链表记录插入顺序)在遍历的时候效率较高,因为,底层另外使用链表记录插入的顺序。EnumSet采用位向量的数据结果存储元素,性能最好。但是只能保存同一个枚举类的枚举值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值