集合的效率问题

LinkedList :假如想在一个列表中部进行大量插入和删除操作,那么 LinkedList 无疑是最恰当的选择 ;若非如此,就情愿选择 ArrayList ,它的速度可能要快一些。


ArraySet:写一个需要 Set 的程序时,应默认选择HashSet 。而且只有在某些特殊情况下(对性能的提升有迫切的需求),才应切换到ArraySet 。

进行 add() 以及 contains() 操作时,HashSet 显然要比 ArraySet 出色得多,而且性能明显与元素的多寡关系不大。一般编写程序的时候,几乎永远用不着使用 ArraySet 。


ArrayList :在 ArrayList 中进行随机访问(即 get() )以及循环反复是最划得来的;但对于 LinkedList 却是一个不小的开销。但另一方面,在列表中部进行插入和删除操作对于 LinkedList 来说却比 ArrayList 划算得多。我们最好的做法也许是先选择一个 ArrayList 作为自己的默认起点。以后若发现由于大量的插入和删除造成了性能的降低,再考虑换成 LinkedList 不迟。



即使大小为 10 ,ArrayMap 的性能也要比 HashMap 差——除反复循环时以外。而在使用 Map 时,反复的作用通常并不重要(get() 通常是我们时间花得最多的地方)。TreeMap 提供了出色的 put() 以及反复时间,但 get()的性能并不佳。但是,我们为什么仍然需要使用 TreeMap 呢?这样一来,我们可以不把它作为 Map 使用,而作为创建顺序列表的一种途径。树的本质在于它总是顺序排列的,不必特别进行排序(它的排序方式马上就要讲到)。一旦填充了一个 TreeMap ,就可以调用 keySet() 来获得键的一个 Set “景象”。然后用 toArray()产生包含了那些键的一个数组。随后,可用 static 方法 Array.binarySearch() 快速查找排好序的数组中的内容。当然,也许只有在 HashMap 的行为不可接受的时候,才需要采用这种做法。因为 HashMap 的设计宗旨就是进行快速的检索操作。最后,当我们使用 Map 时,首要的选择应该是 HashMap 。只有在极少数情况下才需要考虑其他方法。

TreeMap 的创建速度比其他两种类型明显快得多(但你应亲自尝试一下,因为据说新版本可能会改善 ArrayMap 的性能)。考虑到这方面的原因,同时由于前述 TreeMap 出色的 pu t() 性能,所以如果需要创建大量 Map ,而且只有在以后才需要涉及大量检索操作,那么最佳的策略就是:创建和填充TreeMap ;以后检索量增大的时候,再将重要的 TreeMap 转换成 HashMap ——使用 HashMap(Map) 构建器。同样地,只有在事实证明确实存在性能瓶颈后,才应关心这些方面的问题——先用起来,再根据需要加快速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值