第十章 Scala 容器(二):如何选择一个合适的容器类

走远了吗. 提交于 2019-12-03 04:10:49

1. 解决方案

    实际上Scala的容器分为三大类:Seq,Map,Set。Seq容器线性地存储了元素,这些元素或者被以数组加索引的形式存储,或者使用链表的方式存储。Map存储的是键值对,当你想用(key-value)形式时可以使用Map。而Set存储的事不可重复的元素。

2. 选择一个合适的Sequence

    当你想选择一个Seq来使用的时候,你需要考虑两件事:1. 使用索引来快速访问你的容器(数组)中的内容,还是使用链表方式;2. 你的容器中的内容是可变的还是不可变的

    Scala中对于Seq,针对:数组/链表,可变/不可变的组合,推荐使用以下四种通用容器类。

    通过表(10-1)我们可以看出,如果你想使用一个不可变的带索引的容器,你应该选择Vector,如果你想使用一个可变的带索引的容易你应该选择ArrayBuffer。同样的List和ListBuffer为链式存储的不可变和可变容易。

    主要的不可变序列选择表,其中List和Vector是我们通常情况下使用的不可变容器。Queue为先进先出的链式结构,Range为一个带索引的序列,Stack为后进先出的链式结构,Stream则是一个懒加载的List。String比较特殊,作为一个字符串类,实际上它是一个不可变的字符序列(index方式存储)。

    可变序列选择表,Array和ArrayBuffer的区别是,Array不可改变大小;ArrayStack是一个后进先出且以Index方式存储的容器;DoubleLinkedList是一个可变双向链表,它的删除效率非常高;LinkedList是一个可变单项链表,ListBuffer使用起来喝ArrayBuffer一样,但是如果你计划吧一个ArrayBuffer转化为一个链表那么你使用ListBuffer会比较好;MutableList是一个可变单向链表,但是可以在常数时间内添加元素;Queue和Stack就是一个可变的先进先出和后进先出结构;StringBuilder则是一个可变的String。

    选择一个map比选择一个Seq要简单多,你可以直接使用可变的和不可变的Map。SortedMap不可变但是其内容是按key值排序的;LinkedHashMap是可变的,其内容按插入的顺序存储;ListMap则是按插入顺序反序存储;TreeMap是使用红黑树存储

    选择一个Set,Set像Map一样,可以直接使用可变与不可变的Set。SoredSet是按内容排序存储;LinkedHashSet是按插入顺序存储;ListSet可以想使用List一样使用,按插入顺序反序存储;


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!