Java Collections 源码分析
Java Collections API源码分析
侯捷老师剖析了不少Framework,如MFC,STL等。侯老师有句名言:
源码面前,了无秘密
这句话还在知乎引起广泛讨论。
我对教授程序设计的一点想法是:
同学们开始不会编程,最好的学习方式是读教材,敲代码,我还专门写了一篇博客指导同学们敲代码:《积极主动敲代码,使用Junit学习Java程序设计》,我认为阅读经典图书,积极主动敲5000行左右的代码,应该能解决语言基本语法的问题,基本程序设计的问题,基本工具(git,jdb,junit,idea...)的使用问题
然后同学们应该独立编写5000行左右的代码,解决程序逻辑错误的调试,模块分解,数据结构与选用,问题解决的一般过程等相关问题
有了10000行代码的基础,后面的学习提高要依靠代码阅读了,比如JUnit的源码,JHotdraw的源码,Java Collection API的源码,Java JCE的源码等
教学中也是想通过这三个步骤进行训练。
我们这学期主要讲数据结构,希望同学们在学习时能分析一下Java Collection的源代码。
我开玩笑地对朋友说,这本书出版,给大学课程中的“数据结构”和“算法”两门授课老师出了个难题。几乎所有可能的作业题目(复杂度证明题除外),本书都有了详尽的解答。然而,如果学生能够从庞大的 SGI STL 源码中干净抽出某一部份,加上自己的包装,做为呈堂作业,也足以证明你有资格获得学分和高分。事实上,追踪一流作品并于其中吸取养份,远比自己关起门来写个三流作品,价值高得多 — 我的确认为99.99 % 的程序员所写的程序,在 SGI STL 面前都是三流水准。
我相信绝大多数程序员用Java实现的数据结构和算法,相当于Java Collection API也是三流水准,希望同学们通过代码分析学习一流代码的实现方法,技巧等。
源码之前了无秘密,你将看到vector的实现、list的实现、heap的实现、deque的实现、RB-tree的实现、hash-table的实现、set/map 的实现;你将看到各种算法(排序、搜寻、排列组合、数据移动与复制…)的实现;你甚至将看到底层的memory pool 和高阶抽象的traits 机制的实现。那些数据结构、那些算法、那些重要观念、那些编程实务中最重要最根本的珍宝,那些蜇伏已久彷佛已经还给老师的记忆,将重新在你的脑中闪闪发光。
我希望同学们在分析Java Collection API源码时有相同的收获。
代码阅读和分析同学们可以重点参考一下侯捷老师的上穷碧落下黄泉-源码追踪经验谈,文章要点是:
- 不要"一切从轮子造起",参考相关图书,博客
- 用好工具:我们推荐IDEA和SourceInsight
- 要做笔记
- 需要的基础自己要打牢
大家也可以参考:
源码下载
安装JDK时,选中“源代码":
安装完就会出一个src.zip
的文件,解压了就包含Java Collections API的源码:
这些代码在java.util
包中:
总览
ArrayList
参考资料
- 如何阅读别人的代码?
- 如何阅读程序源代码?
- 如何看懂源代码--(分析源代码方法)
- 如何通过阅读别人的代码提高自己的编程能力
- Java Collections Framework - Java集合框架之概要
- Java集合框架之Collection实例解析
- ArrayList源码分析(基于JDK1.6)
版权声明:自由转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0
如果你觉得本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文”
Java Collections 源码分析的更多相关文章
- Java Reference 源码分析
@(Java)[Reference] Java Reference 源码分析 Reference对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互.即可以使 ...
- Java 集合源码分析(一)HashMap
目录 Java 集合源码分析(一)HashMap 1. 概要 2. JDK 7 的 HashMap 3. JDK 1.8 的 HashMap 4. Hashtable 5. JDK 1.7 的 Con ...
- java集合源码分析(三):ArrayList
概述 在前文:java集合源码分析(二):List与AbstractList 和 java集合源码分析(一):Collection 与 AbstractCollection 中,我们大致了解了从 Co ...
- java集合源码分析(六):HashMap
概述 HashMap 是 Map 接口下一个线程不安全的,基于哈希表的实现类.由于他解决哈希冲突的方式是分离链表法,也就是拉链法,因此他的数据结构是数组+链表,在 JDK8 以后,当哈希冲突严重时,H ...
- Java集合【5】-- Collections源码分析
目录 一.Collections接口是做什么的? 二.Collections源码之大类方法 1.提供不可变集合 2.提供同步的集合 3.类型检查 4.提供空集合或者迭代器 5.提供singleton的 ...
- Java集合源码分析(四)Vector<E>
Vector<E>简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长. Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是 ...
- Java集合源码分析(二)ArrayList
ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...
- Java集合类源码分析
常用类及源码分析 集合类 原理分析 Collection List Vector 扩充容量的方法 ensureCapacityHelper很多方法都加入了synchronized同步语句,来保 ...
- Java - ArrayList源码分析
java提高篇(二一)-----ArrayList 一.ArrayList概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 nul ...
随机推荐
- NYOJ--353--bfs+优先队列--3D dungeon
/* Name: NYOJ--3533D dungeon Author: shen_渊 Date: 15/04/17 15:10 Description: bfs()+优先队列,队列也能做,需要开一个 ...
- 这是个巧妙的表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可 以交换 a 和 b 的值。
这不具有可移植性.它试图在序列点之间两次修改变量 a, 而这是无定义的. 例如,有人报告如下代码: int a = 123, b = 7654; a ^= b ^= a ^= b; 在 SCO 优化 ...
- json对象、构造原型、组合继承
一.json对象套路 var stu = { "name": "龙姑娘", age: 16, classmate: { name: "李小玉" ...
- Fluent Validation with Web Api 2
using FluentValidation;using FluentValidation.Attributes;using System;using System.Collections.Gener ...
- 安徽省2016“京胜杯”程序设计大赛_B_阵前第一功
阵前第一功 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 63 Accepted: 29 Description A国每个 ...
- Java 特殊字符的String.split的分割(. \ * | \\)
特殊字符 分割的时候使用: 关于点的问题是用 : String.split("[.]"); String..split("\\.") ; 关于竖线的问题用 ...
- ES6 浅谈let与const 块级作用域之封闭空间(闭包)
ES6新增了 let const 命令,用来声明变量.它的用法类似于 var ,但是所声明的变量,只在 let const 命令所在的代码块内有效. var const 不允许重复声明 用处: 可 ...
- owncloud存储云服务搭建
owncloud是一款开源的存储云,用php写的,其作用可以像百度网盘那样存放文件到这个云当中, 只要能连上网,手机,平板,电脑都可以从中下载或者上传文件,用起来非常还不错,部署的过程也很简单,废话不 ...
- append()方法生成的元素绑定的事件失效解决办法
我使用append()方法动态生成的a链接的click事件没有起效果,查找了资料,了解到,我使用的onclick方法绑定的事件对动态生成的元素是无效的,解决办法如下: 使用事件委托,并且要用on来绑定 ...
- java核心技术卷一笔记(2)
---恢复内容开始--- 异常.断言 所有的异常都继承自Throwable类,异常包括已检查异常和未检查异常,应该抛出已检查异常,而未检查异常要么是不可控的(Error),要么是应该避免发生的(Run ...