[自用篇]—Java常用Set集合的基础总结

Set集合

Set集合通常不能记住元素的顺序,且不允许包含重复的元素(add()方法返回false,且相同的新元素不会被添加)。与Collection基本相同,没有提供其他额外的方法。

HashSet

按照Hash算法来存储集合中的元素,具有很好的存取和查找性能

特点

1. 不能保证元素的排列顺序
2. HashSet不是同步的,当有多个线程同时访问一个HashSet集合时,必须通过代码来保证其同步
3. 集合的元素值可以是null

元素与HashSet的联系

除了上述提及到的以外,还有其他一些值得记述的

HashSet集合判断两个元素相等的标准:
两个对象通过==equals()方法比较相等,且两个对象通过HashCode()==方法得到的hashCode值也相等

当向HashSet集合中存入一个元素时,HashSet 会调用该对象的 HashCode()方法得到该对象的hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。

如果两个元素通过equals()方法比较返回true但它们的HashCode()方法返回的值不同,HashSet将会把它们存储在不同的位置(及向HashSet中添加了两个“相同”的元素)

TreeSet

TreeSet是SortedSet接口的实现类。

可以确保集合元素处于排序状态,且相对于HashSet还提供了额外的方法。但注意,TreeSet不是根据插入的顺序进行排序的,而是根据元素的实际值大小来进行排序。

TreeSet采用红黑树的数据结构来存储集合元素,支持两种排序方法:自然排序和自定义排序(或称为定制排序),默认情况下采用自然排序

TreeSet是线程不安全的

TreeSet的排序方法

TreeSet判断两个对象是否相等的唯一标准是:两个对象通过compareTo(Object obj)方法比较,若比较相等,新对象无法添加到集合中。(向TreeSet中添加的类一定是要实现了compareTo(Object obj)的方法)

自然排序

TreeSet会调用集合元素的compareTo(Object obj)方法来进行比较元素之间大小的关系,然后将集合元素按升序排列(需要注意的是采用自然排序向TreeSet中添加的应该是同一个类的对象或是同一个类的实例,否则会引发ClassCastException)。

定制排序

通过Comparator接口实现

如果需要定制排序,则需要在创建TreeSet集合对象时,提供一个Comparator对象与TreeSet集合关联,由该Comparator对象负责集合元素的排序逻辑。(Comparator是一个函数式接口,可以使用Lambda表达式来实现)。

EnumSet

一个专门为枚举类设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式地指定

特点

1. EnumSet的集合元素是有序的,EnumSet以枚举值在Enum类定义顺序来决定集合元素的顺序
2. 内部以位向量的形式存储,因此EnumSet占用内存小,且运行效率相对而言高。
3. 不能插入null元素,否则会引发NullPointerException异常
4. EnumSet没有暴露任何构造器来创建该类的实例,但提供了相关类方法来实现
5. 多线程访问时,需要添加代码保证同步

各Set实现类的分析

HashSet和TreeSet是最常用的,且也是最典型的。

TreeSet适用于一个需要保持排序的Set时,但因为TreeSet需要额外的红黑树算法来维护集合元素的次序,所以性能相对HashSet而言更低。因此,在其他情况下HashSet是相对而言更优的选择。

EnumSet是所有Set实现中性能最好的,但缺点是只能保存同一个枚举类的枚举值作为集合元素。

HashSet、TreeSet和EnumSet都是线程不安全的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值