scala的list源码解密
2015-08-11 23:09
369 查看
今日【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的时候我们就把它复制一份,这就产生了一个新的列表。
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的时候我们就把它复制一份,这就产生了一个新的列表。
相关文章推荐
- jQuery版感应鼠标显示隐藏的菜单
- Linux学习笔记:常用命令总结
- Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数(转)
- eclipse启动Tomcat服务输入http://localhost:8080/报404解决方法
- 简单的学生类
- 网址保存
- 【LeetCode】169 - Majority Element
- 使用U盘安装Centos 6.5操作系统,磁盘分区过程中出现,"sda必须有一个gpt磁盘标签"
- 1045 access denied for user 'root'@'localhost' using password yes
- hdu 2199 Can you solve this equation?
- OC第一节
- cocos ide 出现连接ide超时的原因和解决办法
- “rmdir: failed to remove ‘tmp’: Directory not empty”解决方案–Linux命令行如何删除非空文件夹
- css进阶学习
- 使用elasticsearch与kibana来分析nginx日志小结
- IOS中使用本地通知为你的APP添加提示用户功能
- arm汇编输出
- 微信公众平台赞赏功能真的要来了 已进入邀请内测阶段
- 【转载】LINUX 和 WINDOWS 内核的区别
- 二级联动