Java 集合框架 Set实现

集合实现被分组到通用目标和特殊目的实现中。

通用集合的实现

有三个通用的集合实现:HashSet、TreeSet和LinkedHashSet。这三个中的任何一个通常是简单的。HashSet比TreeSet(大多数操作的常量时间和logtime)要快得多,但是没有提供安全保证。如果需要在SortedSet接口中使用操作,或者需要使用值排序迭代,使用TreeSet;否则,使用HashSet。很有可能你会在大部分时间里使用HashSet。

LinkedHashSet在某种意义上介于HashSet和TreeSet之间。它作为一个散列表实现,其中有一个链表在其中运行,它提供了插入排序的迭代(最近插入到最近的),并且运行速度几乎和HashSet一样快。LinkedHashSet实现将其客户机从HashSet提供的未指定的、通常混乱的顺序中保留下来,而不会引起与TreeSet相关的增加的成本。

关于HashSet,值得记住的一点是,迭代在条目数和桶数(容量)的和中是线性的。因此,选择一个过高的初始容量既浪费时间又浪费时间。另一方面,在每次被迫增加容量的情况下,通过复制数据结构来选择低浪费时间的初始容量。如果没有指定初始容量,默认值是16。在过去,选择质数作为初始容量有一定的优势。这不再是事实。在内部,容量总是集中到2的幂。初始容量是使用int构造函数指定的。下面一行代码分配了一个初始容量为64的HashSet。

Set<String> s = new HashSet<String>(64);

HashSet类有一个其他的调优参数,称为负载因子。如果您非常关心您的HashSet的空间消耗,请阅读HashSet文档以获取更多信息。否则,只接受默认值;这几乎总是正确的做法。

如果您接受默认的负载因素,但是要指定初始容量,那么选择一个与您期望的开始增长的大小的两倍的数字。如果你的猜测是错误的,你可能会浪费一点空间、时间或两者,但这不太可能是一个大问题。

LinkedHashSet具有与HashSet相同的调优参数,但是迭代时间不受容量影响。TreeSet没有调优参数。

专用集合实现

有两个特殊目的集实现——EnumSet和CopyOnWriteArraySet。

EnumSet是枚举类型的高性能集实现。枚举集的所有成员必须是相同的枚举类型。在内部,它由一个位向量表示,通常为一个长。枚举集支持枚举类型的范围。例如,考虑到每周的enum声明,您可以在工作日中迭代。EnumSet类提供了一个静态工厂,使它变得简单。

  for (Day d : EnumSet.range(Day.MONDAY, Day.FRIDAY))
        System.out.println(d);

Enum集合还提供了一个丰富的、类型安全的替换传统位标志。

    EnumSet.of(Style.BOLD, Style.ITALIC)

CopyOnWriteArraySet是一个由复制-on-write数组支持的集合实现。所有的假定操作,例如add、set和remove,都是通过创建数组的新副本实现的;不需要锁定。甚至迭代可以安全地同时进行元素插入和删除。与大多数的Set实现不同,添加、删除和包含方法需要时间与集合的大小成比例。这个实现只适合很少修改但经常迭代的集合。它非常适合维护必须防止重复的事件处理程序列表。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值