第82讲:Scala中List的ListBuffer是如何实现高效的遍历计算的?学习笔记

82讲:ScalaListListBuffer是如何实现高效的遍历计算的?学习笔记

本讲讲解对list集合类型的数据结构元素进行遍历访问时的效率问题,

对比几种算法,引出ListBuffer使用时是如何高效操作list的。

list/array对元素遍历是最基本的操作

ListListBufferjava中的StringStringBuffer的设计很相似,ListString设计默认是不可变的,var list = List[XX]形式生成的list虽然有var作修饰,但类型认为immutable,向其中添加元素时,会有很多中间变量产生,空间浪费很大。相比较而言,ListBuffer类型本可以在添加元素时避免中间变量的产生,省空间,避免频繁的GC

 

object DT82 {

  def main(args: Array[String]) {

    val list = List(1,2,3,4,5,6,7,8,9)

    increment(list)

    increment_MoreEffective(list)

    increment_MostEffective(list)

  }

  def increment(list: List[Int]): List[Int] = list match{

    case List() => List()  //list时返回空list

    case head :: tail => head + 1 :: increment(tail)

    //第一个元素+1,::操作再次调用increment()

    //increment(tail)是递归函数调用,每次调用都会产生堆栈,

    //内存消耗非常大,效率非常低。

  }

  def increment_MoreEffective(list: List[Int]): List[Int] = {

    var result = List[Int]()  //定义一个空的List:result

    for(element <- list) result = result ::: List(element + 1)

    result

    //List天然是不可变的,每次调用:::时会产生很多中间对象,所以效率也低。

  }

  def increment_MostEffective(list: List[Int]): List[Int] = {

    import scala.collection.mutable.ListBuffer

    //List本身相当于是StringListBuffer相当于String Buffer

    var buffer = new ListBuffer[Int]

    //可以不断地在ListBuffer后面累加元素,而buffer的内容是不变的。

    for(element <- list) buffer += element + 1

    buffer.toList

    //这种方式没有递归,又能保持是一个元素。

    //ListBuffer本身的构造是前面元素是一个集合,后面是一个元素本身。

    //不会随着元素的累加ListBuffer元素越来越多,不会导致toList变成List本身时效率有损耗,

    //因为这种方式不会拷贝元素。

  }

 

/*ListBuffer的源码:

def += (x: A): this.type = {

  if (exported) copy()    //exportedtoList时就把exported变为true

  if (start.isEmpty) {

    last0 = new :: (x, Nil)

    start = last0

  } else {

    val last1 = last0

    last0 = new :: (x, Nil)

    last1.t1 = last0

    //不断在后面追加元素。

  }

  len += 1

  this

}

*/

 

以上内容是从王家林老师DT大数据课程第82讲的学习笔记。
DT大数据微信公众账号:DT_Spark  

王家林老师QQ:1740415547 

王家林老师微信号:18610086859
scala82讲视频观看链接:
http://yun.baidu.com/s/1pJKdKqn
我的百度网盘共享的DT大数据梦工厂王家林老师第1-82讲的视频内容:http://pan.baidu.com/s/1qWK9CMo

今日【DT大数据梦工厂视频】《第82讲:Scala中List的ListBuffer是如何实现高效的遍历计算的?》
土豆视频:http://www.tudou.com/programs/view/WBW9Ki9Y_1g/ 
优酷视频:http://v.youku.com/v_show/id_XMTMwNTk0NjUwNA==.html?from=y1.7-1.2 
56网视频:http://www.56.com/u63/v_MTM4MzM3MTk2.html 
 (DT大数据梦工厂scala的所有视频、PPT和代码在百度云盘的链接:http://pan.baidu.com/share/home?uk=4013289088#category/type=0&qq-pf-to=pcqq.group)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值