JDK集合框架源码分析 - 简单概要
1.类继承体系
在集合框架的类继承体系中,最顶层有两个接口Collection、Map;
- Collection 表示一组纯数据
- Map 表示一组key-value对
Collection的类继承体系:

Map的类继承体系:

2.集合框架
2.1 ArrayList
可变数组的实现,高效随机访问RandomAccess ,但插入和删除元素时需要复制数组,开销较大;默认容量10,扩容为原来的1.5倍(oldCapacity + (oldCapacity >> 1));
fail-fast : modCount记录容器发生结构化修改的次数(ensureExplicitCapacity 方法中加1)
添加:add、add(index, E)、add(Collection)、add(index, Collection)
移除:remove、fastremove(System.arraycopy)、置null来GC、trimToSize调整数组大小
获取和修改:indexof、get、set(不会修改modCount)
迭代、SubList子列表、序列化
2.2 HashMap
哈希表实现(单向链表),数组中每一个元素都是一个链表,把数组中的每一格称为一个桶(bin或bucket);容量默认为16、装载因子0.75f、扩容x2;
哈希碰撞问题;
hash实现:在Java 1.8的实现中,是通过hashCode()的高16位异或低16位实现的:(h = k.hashCode()) ^ (h >>> 16),主要是从速度、功效、质量来考虑的,这么做可以在bucket的n比较小的时候,也能保证考虑到高低bit都参与到hash的计算中,同时不会有太大的开销
链表转化成红黑树TREEIFY_THRESHOLD = 8,红黑树转化成链表UNTREEIFY_THRESHOLD = 6;
2.3 Vector 与 Stack
(不推荐,推荐使用 Deque 接口的实现,如 LinkedList 和 ArrayDeque)
Vector 可增长对象数组,线程安全;扩容加倍
Stack 基于Vector,LIFO
2.4 Deque 与 ArrayDeque
Collection -> Queue -> Deque 具体实现ArrayDeque ;
Deque 双端队列;
ArrayDeque可变数组实现,自动扩容,不支持null;默认容量16,必须为2^n;
2.5 LinkedList
双向链表实现,实现了Deque 接口;
2.6 LinkedHashMap
基于链表和哈希表实现,扩展HashMap 增加了双向链表的实现;
支持按插入序 (insertion-order) 或访问序 (access-order) 来访问其中的元素;访问顺序LRU;
支持为 null 的键和值;
双向链表将所有的 Entry 串在一起,支持按照插入顺序或访问顺序来遍历所有的 Entry;
2.7 枚举
类型安全和可读性,实现了 values() 和 valueOf() 这两个静态方法;
单例模式实现(最佳方案);
Enum(name,ordinal)
EnumSet 必须是来自同一个 enum,内部使用 bit 向量实现,这种实现方式更紧凑高效;
EnumMap 是一种特殊的 Map,要求其中的键 (key) 必须来自于同一个 enum。由于自身的实例数量有限,在内部可由数组实现,因此速度很快;
2.8 TreeMap
基于红黑树实现的 Key-Value 结构;SortedMap -> NavigableMap -> TreeMap;
非线程安全;
Key默认自然序,不支持null,也可实现 Comparable 接口,自定义比较器可以接受null;
2.9 Set
内部通常基于 Map实现,Map 中的 Key构成了 Set,而 Value 全部使用一个无意义的 Object ;
基于 HashMap 的 HashSet 是无序时的最佳通用实现,
基于 LinkedHashMap 的 LinkedHashSet 保留插入或访问的顺序,
基于 TreeMap 的 TreeSet 可以按照元素升序排列,要求元素实现 Comaprable 接口或自定义比较器以上都是非线程安全;
2.10 CopyOnWriteArraySet
线程安全,并发优化的ArrayList,通过 CopyOnWriteArrayList 实现;
CopyOnWriteArrayList,是一个线程安全的List接口的实现,它使用了ReentrantLock锁来保证在并发情况下提供高性能的并发读取;
3.注意点
1.基于结构化修改的次数来实现 fail-fast 机制,比较modCount 和 expectModCount;
源码分析:
http://blog.jrwang.me/tags/Source-Code-Analysis/
JDK集合框架源码分析 - 简单概要的更多相关文章
- Java集合框架源码分析(2)LinkedList
链表(LinkedList) 数组(array)和数组列表(ArrayList)都有一个重大的缺陷: 从数组的中间位置删除一个元素要付出很大的代价,因为数组中在被删除元素之后的所有元素都要向数组的前端 ...
- [集合]Collection集合框架源码分析
Collection接口 在java的集合类库中,基本接口是Collection,该接口的在集合中的源码定义如下(将源码中的注释删掉了): public interface Collection< ...
- YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)
YII 框架源码分析 百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...
- Java集合框架源码(二)——hashSet
注:本人的源码基于JDK1.8.0,JDK的版本可以在命令行模式下通过java -version命令查看. 在前面的博文(Java集合框架源码(一)——hashMap)中我们详细讲了HashMap的原 ...
- 【java集合框架源码剖析系列】java源码剖析之TreeSet
本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...
- 【java集合框架源码剖析系列】java源码剖析之HashSet
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于HashSet的知识. 一HashSet的定义: public class HashSet&l ...
- 【java集合框架源码剖析系列】java源码剖析之TreeMap
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于TreeMap的知识. 一TreeMap的定义: public class TreeMap&l ...
- 【java集合框架源码剖析系列】java源码剖析之ArrayList
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 本博客将从源码角度带领大家学习关于ArrayList的知识. 一ArrayList类的定义: public class Arr ...
- 【java集合框架源码剖析系列】java源码剖析之LinkedList
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识. ...
随机推荐
- [NOIP2017]注意点
1.数据大却没开long long 导致的gg.2.文件读入时stdin打成stdout...3.桶维护数值,有负值要平移,且数值最好稍大(否则可能RE).4.很智障地打错变量.5.DP或其他涉及到转 ...
- HY中考游记
回首三年荏苒,还是有许多忘不了,有始有终,最后以一篇游记来记录落幕吧 Day -inf 为了准备中考从机(颓)房回到学校了,停课这么久,也该好好备考了 希望能回到以前的文化课水平QAQ Day -? ...
- R-CNN常见问题
可以不进行特定样本下的微调吗?可以直接采用AlexNet CNN网络的特征进行SVM训练吗? 不针对特定任务进行微调,而将CNN当成特征提取器,pool5层得到的特征是基础特征,类似于HOG.SIFT ...
- Spring Cloud Config教程(四)快速开始
Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持.使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring ...
- (转)WebRTC信令控制与STUN/TURN服务器搭建
转:https://rtcdeveloper.com/t/topic/13742 本文将向大家介绍两个方面的知识: WebRTC信令控制 STUN/TURN服务器的搭建 在前面的文章中已经向大家介绍了 ...
- What is 'typeof define === 'function' && define['amd']' used for?
What is 'typeof define === 'function' && define['amd']' used for? This code checks for the p ...
- VC CString,int,string,char*之间的转换
CString转string : CString strMfc = "test"; std::string strStr; strStr = strMfc.GetBuffer(); ...
- 线对 Line pairs、LP(分辨率cy/mm)
线对 (Line pairs) 是胶片.镜头等电影摄影领域的专用名词. 每毫米线对一般指分辨率的单位,指仪器在一毫米内能分辨出多少对线. 在一定尺度内的可分辨线对数常被用来衡量仪器的空间分辨能力,能分 ...
- 阶段3 1.Mybatis_02.Mybatis入门案例_2.mybatis入门案例中的设计模式分析
读取配合文件 创建工厂 最终图
- 6.k8s.存储Volume.PV.PVC
#Volume Volume 解决数据持久化和容器间共享数据 Kubernetes支持几十种类型的后端存储卷 #hostPath挂载实例,挂载Node节点/tmp/test-volume目录到容器/t ...