scala 集合类库API性能对比大全

转载:不允许转载请告知,在第一时间删除。

scala 集合类库使用率非常频繁,也是其它语言开发者羡慕不已功能。本篇讲说明类库中相同的API的执行效率对比,作为使用时的参考依据。只是理论上的特点,没有具体指标量化。

原文传送门 Author: heathermiller

为阅读方便,对内容稍作调整。

不同的容器类型具有不同的性能特点。这通常是选择容器类型的首要依据。以下的两张表格,总结了一些关于容器类型常用操作的性能特点。

标志位解释

为便于理解,先对各标志位做说明:

术语 操作功能描述
C 指操作的时间复杂度为常数
eC 指操作的时间复杂度实际上为常数,但可能依赖于诸如一个向量最大长度或是哈希键的分布情况等一些假设。
aC 该操作的均摊运行时间为常数。某些调用的可能耗时较长,但多次调用之下,每次调用的平均耗时是常数。
Log 操作的耗时与容器大小的对数成正比。
L 操作是线性的,耗时与容器的大小成正比。
- 操作不被支持。

序列类型的性能特点

根据需求选择序列,会大幅提升性能。具体的性能评估如下:

不可变序列性能特点

不可变序列 head tail apply update prepend append insert
List C C L L C L -
Stream C C L L C L -
Vector eC eC eC eC eC eC -
Stack C C L L C L L
Queue aC aC L L C C -
Range C C C - - - -
String C L C L L L -

可变序列性能特点

可变序列 head tail apply update prepend append insert
ArrayBuffer C L C C L aC L
ListBuffer C L L L C C L
StringBuilder C L C C L aC L
MutableList C L L L C C L
Queue C L L L C C L
ArraySeq C L C C - - -
Stack C L L L C L L
ArrayStack C L C C aC L L
Array C L C C - - -

序列中操作的功能描述

  • head: 选择序列的第一个元素
  • tail : 生成一个包含除第一个元素以外所有其他元素的新的列表。
  • apply : 索引
  • update: 功能性更新不可变序列,同步更新可变序列。
  • prepend: 添加一个元素到序列头。对于不可变序列,操作会生成个新的序列。对于可变序列,操作会修改原有的序列。
  • append: 在序列尾部插入一个元素。对于不可变序列,这将产生一个新的序列。对于可变序列,这将修改原有的序列。
  • insert : 在序列的任意位置上插入一个元素。只有可变序列支持该操作。

集合和映射类型的性能特点

不可变序列性能

不可变序列 lookup add remove min
HashSet/HashMap eC eC eC L
TreeSet/TreeMap Log Log Log Log
BitSet C L L eC1
ListMap L L L L

可变序列性能

可变序列 lookup add remove min
HashSet/HashMap eC eC eC L
WeakHashMap eC eC eC L
BitSet C aC C eC1
TreeSet Log Log Log Log

可变和不可变集与映射功能描述

  • lookup 测试一个元素是否被包含在集合中,或者找出一个键对应的值
  • add 添加一个新的元素到一个集合中或者添加一个键值对到一个映射中
  • remove 移除一个集合中的一个元素或者移除一个映射中一个键。
  • min 集合中的最小元素,或者映射中的最小键。

据说,点赞年终奖会Double。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 5,960评论 0 13
  • 四、集合框架 1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串。生活中很多数据的描述都采...
    佘大将军阅读 4,140评论 0 2
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,818评论 1 32
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 9,877评论 1 14
  • 拉杆箱设计灵感再现广交会的启示 Todywu2016-4-19 这次广交会电子产品展上,出现了箱包手袋行业的新...
    todywu阅读 4,714评论 2 50