scala中List、Array、ListBuffer、ArrayList、Set、元组区别

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值