今日【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的时候我们就把它复制一份,这就产生了一个新的列表。

转载于:https://www.cnblogs.com/trgaaaaa/p/4722620.html

scala的list源码解密相关推荐

  1. 第91课:SparkStreaming基于Kafka Direct案例实战和内幕源码解密 java.lang.ClassNotFoundException 踩坑解决问题详细内幕版本

    第91课:SparkStreaming基于Kafka Direct案例实战和内幕源码解密    /* * *王家林老师授课http://weibo.com/ilovepains */  每天晚上20: ...

  2. Promise源码解密-Promise A+标准

    系列文章 Promise源码解密-PromisesA+标准 Promise源码解密-同步版 Promise源码解密-异步版 Promise源码解密-then的链式调用 Promise源码解密-catc ...

  3. php开心农场游戏源码,解密开源版开心农场游戏小程序分享

    源码介绍 分享一款可以盈利的游戏小程序--开心农场,解密开源版源码. 综述:对于盈利方式我们也在探索.没有任何一种盈利方式可以让每个玩家都能实现盈利. 所以我们会尽可能的多想一些盈利方式.游难的核心开 ...

  4. 推荐 7 个 Vue2、Vue3 源码解密分析的开源项目

    大家好,我是你们的 猫哥,那个不喜欢吃鱼.又不喜欢喵 的超级猫 ~ 1. 为什么要学习源码 ? 阅读优秀的代码的目的是让我们能够写出优秀的代码. 不给自己设限,不要让你周围人的技术上限成为你的上限.其 ...

  5. scala map方法源码

    val arr=Array(1,2,3,4)arr.map(x=>x*2) 源码 //第一个参数,传入一个函数,第二个参数为隐式参数 def map[B, That](f: A => B) ...

  6. php源码解密微盾,php源码加密 仿微盾PHP加密专家(PHPCodeLock)的简单示例

    感兴趣的小伙伴,下面一起跟随512笔记的小编小韵来看看吧! 代码如下: //512笔记网 Www.512Pic.com function T_rndstr($length=""){ ...

  7. 表单源码php,PHP微信表单源码解密开源版 微擎原版功能模块 多功能表单 微信万能表单2.8WEUI高级版...

    本模块主要用于实现各行业的报名.预约.加盟申请.调查等应用在微信端的实现,支持创建N个表单主题,每个表单主题功能设置均独立. 01.自定义表单模型(自定义字段支持字符串.数字.单选.多选.下拉.日历. ...

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

    Spark Streaming的DStream为我们提供了一个updateStateByKey方法,它的主要功能是可以随着时间的流逝在Spark Streaming中为每一个key维护一份state状 ...

  9. 解忧云SMS短信发送系统服务平台源码+解密完美版

    正文: 解忧云SMS短信服务平台系统,短信发送系统,全解密完美版,经过一系列修复现在程序已经可以完全使用. 并且是全解密随时可以二开,无后门,一些bug已经完全修复. 安装教程: 数据库配置文件路径  ...

最新文章

  1. 分享Kali Linux 2016.2第45周镜像
  2. 云不再遥远,云将无处不在
  3. 网站建设需要抠好每一个细节
  4. 【转】eclipse技巧1
  5. 3.Android的新虚拟ART与原虚拟机DVM的区别
  6. 数据缓存 php,数据缓存 · ThinkPHP3.2.3完全开发手册 · 看云
  7. Java 编程下的并发线程之间的同步代码块死锁
  8. HTML5导航栏菜单的设计与实现
  9. matlab 索力迭代,索梁组合体系桥梁施工索力确定的割线迭代法
  10. 微服务那么热,创业公司怎么选用实践?
  11. 关于发邮件报错535 Error:authentication failed解决方法
  12. WIN10什么都没开内存占用率过高, WIN7单网卡设置双IP
  13. 大数据分析中常用的方法有哪些
  14. Win10台式电脑怎么不拔网线断网
  15. clion ros debug clion配置ros环境及调试
  16. python100天从新手到大师下载_GitHub - chenqiyi/Python-100-Days: Python - 100天从新手到大师...
  17. 选择阿里云服务器的理由
  18. deepin/ubuntu 网易云解锁 UnblockNeteaseMusic
  19. char如何储存那么多汉字
  20. java中所有import意思,java 程序中用到的所有类都必须使用 import 语句。

热门文章

  1. java 优先队列_优先队列Java
  2. oops程序是什么意思_OOPS中的抽象是什么?
  3. C++ 判断字符串是否全是数字
  4. C++ 编写WebService服务
  5. Java面试题分享,这份资料包你值得拥有!
  6. CentOS7 搭建samba服务
  7. Ambari HDP 完整安装手册
  8. mysql的联表删除
  9. fatal error C1853: 'Debug/***.pch' is not a precompiled header file created with this compil
  10. ios 类别(category)