1.List列表:不可变
LIst支持在头部快速添加和移除条目,但是不提供快速按下标访问的功能,这个功能需要线性遍历列。
快速的头部添加和移除意味着模式匹配很顺畅
List列表跟数组非常像,2者都是同构的,同一个列表的所有元素必须是相同类型。
但是有2个重要区别
- 1,List是不可变的,元素不能通过赋值改变。
- 2.列表的结构是递归的(即链表,linkedList),而数组是平等的。
使用toList、toArray相互转换:
scala> Array(1,2,3).toList
res14: List[Int] = List(1, 2, 3)
scala> List(1,2,3).toArray
res15: Array[Int] = Array(1, 2, 3)
2.Array数组:可变
提供下标高效访问(获取或更新)指定位置的元素值
3.列表缓冲LIstBuffer:可变
List提供头部快速访问,对尾部访问则没那么高效。List追加元素,通常考虑反过来,追加元素,再调用reverset
另一个可选方案,使用ListBuffer,提供了常量时间的往后追加和往前追加的操作,最后调用toList获取List。
4.数组缓冲ArrayBuffer:可变
跟Array很像,除了可以额外地从序列头部或尾部添加或移除元素。
所有的Array操作在ArrayBuffer都可用。不过由于实现的包装,会稍慢一些。
新的添加和移除操作平均而言是常量时间,不过偶尔会需要线性的时间,这是因为其实现需要不时地分配新的数组来保存缓存的内容。
5.集Set,提供了可变和不可变
每个元素对象最多出现一次
6.元组
不同于数组或列表可以持有不同类型的对象(数组和列表也可以存,不过泛型参数就变为Any了)
7.Map,提供了可变和不可变
这里顺便说下传名参数:
val cache = scala.collection.mutable.Map(1-> "a",2-> "b",3->"c")
定义一个函数:
scala> def f(x: String) = {
| println("taking my time"); Thread.sleep(100)
| x.reverse}
//defgetOrElseUpdate(key: A, op: ⇒ B): B,第二个参数是个传名参数,所以如果k存在,不会执行。
scala> cache.getOrElseUpdate(10,f("abc"))
taking my time
res33: String = cba