scala的list源码解密

今日【DT大数据梦工厂视频】《第83讲:Scala中List的实现内幕源码揭秘》
51CTO视频:http://edu.51cto.com/lesson/id-71363.html
土豆视频:http://www.tudou.com/programs/view/Qp70gLn7jr8/

优酷视频:http://v.youku.com/v_show/id_XMTMwNjU0NTI0NA==.html?from=y1.7-1.2

腾讯视频:http://v.qq.com/boke/page/u/0/m/u0162a7d3um.html

56网视频:http://www.56.com/u36/v_MTM4MzQ2NDk3.html

(DT大数据梦工厂scala的所有视频、PPT和代码在百度云盘的链接:http://url.cn/fSFPjS)
本讲视频是王家林老师通过认真解读scala源码的方式讲解了《Scala中List的实现内幕源码揭秘》

List本身继承ListBuffer,拥有ListBuffer中非私有的方法。
对List的操作其实有部分是通过ListBuffer完成的。
exported为LiftBuffer中flag(default:false),
当flag为true时,表明Buffer已进行了toList操作,
此时再进行连接等操作时,会有copy链表的动作发生,
消耗内存。
scala的Listd take(n:Int)源码:
override def take(n:Int):List[A]={
val b = new ListBuffer[A]
var i= 0
var these = this
while(!these.isEmpty && i<n){
i += 1
b += these.tail
}
if(these.isEmpty) this
else b.toList
}
这里构建了一个高效的ListBuffer的实例b,最后将实例b通过b.toList方法变成List.toList方法的源代码如下:
override def toList:List[A]={
exported = !start.isEmpty
start
}
这里ListBuffer返回的是其第一个元素,所以ListBuffer的toList是一个高效的方法。
List的子类::的源代码如下:
final case class ::[B](private var hd:B,private[scala] var tl:List[B])extends List[B]{....}
这里第二个参数tl是除了第一个参数之外所构成的一个List,修饰符private[scala]表示只有scala包下的对象才能访问,
所以ListBuffer可以访问第二个参数tl。
ListBuffer的源代码如下:
private var start:List[A] = Nil
private var last0: ::[A]=_
private exported:Boolean = false
private var len = 0
这里的start指向了存储缓存的所有列表,默认值是Nil.
ListBuffer的toList方法的源代码如下:
override def toList:List[A]={
exported = !start.isEmpty
start
}
所以toList不会复制存储ListBuffer里面的列表,他只负责返回第一个元素,
所以toList的效率非常高。
ListBuffer的追加元素的方法+=的源代码如下:
def +=(x:A): this.type = {
if(exported)copy()
.....
}
这说明如果ListBuffer变成了List的时候我们就把它复制一份,这就产生了一个新的列表。

时间: 2024-11-07 02:52:32

scala的list源码解密的相关文章

第85课:基于HDFS的SparkStreaming案例实战和内幕源码解密

一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动start-history-server.sh,如下图所示: 二:HDFS的SparkStreaming案例实战(代码部分) package com.dt.spark.SparkApps.sparkstreaming; import org.apache.spark.SparkConf; import o

第88课:Spark Streaming从Flume Pull数据案例实战及内幕源码解密

本节课分成二部分讲解: 一.Spark Streaming on Pulling from Flume实战 二.Spark Streaming on Pulling from Flume源码解析 先简单介绍下Flume的两种模式:推模式(Flume push to Spark Streaming)和 拉模式(Spark Streaming pull from Flume ) 采用推模式:推模式的理解就是Flume作为缓存,存有数据.监听对应端口,如果服务可以连接,就将数据push过去.(简单,耦

第93课:Spark Streaming updateStateByKey案例实战和内幕源码解密

本节课程主要分二个部分: 一.Spark Streaming updateStateByKey案例实战二.Spark Streaming updateStateByKey源码解密 第一部分: updateStateByKey的主要功能是随着时间的流逝,在Spark Streaming中可以为每一个可以通过CheckPoint来维护一份state状态,通过更新函数对该key的状态不断更新:对每一个新批次的数据(batch)而言,Spark Streaming通过使用updateStateByKey

第85讲:基于HDFS的SparkStreaming案例实战和内幕源码解密

一:Spark集群开发环境准备 启动HDFS,如下图所示: 通过web端查看节点正常启动,如下图所示: 2.启动Spark集群,如下图所示: 通过web端查看集群启动正常,如下图所示: 3.启动start-history-server.sh,如下图所示: 二:HDFS的SparkStreaming案例实战(代码部分) package com.dt.spark.SparkApps.sparkstreaming; import org.apache.spark.SparkConf; import o

Spark Streaming发行版笔记14:updateStateByKey和mapWithState源码解密

本篇从二个方面进行源码分析: 一.updateStateByKey解密 二.mapWithState解密 通过对Spark研究角度来研究jvm.分布式.图计算.架构设计.软件工程思想,可以学到很多东西. 进行黑名单动态生成和过滤例子中会用到updateStateByKey方法,此方法在DStream类中没有定义,需要在 DStream的object区域通过隐式转换来找,如下面的代码: object DStream {   // `toPairDStreamFunctions` was in Sp

第88课:Spark Streaming从Flume Poll数据案例实战和内幕源码解密

本节课分成二部分讲解: 一.Spark Streaming on Polling from Flume实战 二.Spark Streaming on Polling from Flume源码 第一部分: 推模式(Flume push SparkStreaming) VS 拉模式(SparkStreaming poll Flume) 采用推模式:推模式的理解就是Flume作为缓存,存有数据.监听对应端口,如果服务可以链接,就将数据push过去.(简单,耦合要低),缺点是SparkStreaming

Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕

本课主题 Spark Executor 工作原理图 ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕 Executor 具体是如何工作的 Spark Executor 工作原理图 第一步:Master 发指令给 Worker 启动 Executor: 第二步:Worker 接收到 Master 发送过来的指令通过 ExecutorRunner 远程启动另外一个线程来运行 Executor: 第三步:通过发送 RegisterExecutor 向 Driver 注册 E

第93课:SparkStreaming updateStateByKey 基本操作综合案例实战和内幕源码解密

Spark Streaming的DStream为我们提供了一个updateStateByKey方法,它的主要功能是可以随着时间的流逝在Spark Streaming中为每一个key维护一份state状态,通过更新函数对该key的状态不断更新.对每一个新的batch而言,Spark Streaming会在使用updateStateByKey的时候为已经存在的key进行state的状态更新(对每个新出现的key,会同样执行state的更新函数操作),但是如果通过更新函数对state更新后返回none

第87课:Flume推送数据到SparkStreaming案例实战和内幕源码解密

本期内容: 1. Flume on HDFS案例回顾 2. Flume推送数据到Spark Streaming实战 3. 原理绘图剖析 1. Flume on HDFS案例回顾 上节课要求大家自己安装配置Flume,并且测试数据的传输.我昨天是要求传送的HDFS上. 文件配置: ~/.bashrc: export FLUME_HOME=/usr/local/flume/apache-flume-1.6.0-bin export FLUME_CONF_DIR=$FLUME_HOME/conf PA