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/

http://yikun.github.io/

 

JDK集合框架源码分析 - 简单概要的更多相关文章

  1. Java集合框架源码分析(2)LinkedList

    链表(LinkedList) 数组(array)和数组列表(ArrayList)都有一个重大的缺陷: 从数组的中间位置删除一个元素要付出很大的代价,因为数组中在被删除元素之后的所有元素都要向数组的前端 ...

  2. [集合]Collection集合框架源码分析

    Collection接口 在java的集合类库中,基本接口是Collection,该接口的在集合中的源码定义如下(将源码中的注释删掉了): public interface Collection< ...

  3. YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

           YII 框架源码分析    百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...

  4. Java集合框架源码(二)——hashSet

    注:本人的源码基于JDK1.8.0,JDK的版本可以在命令行模式下通过java -version命令查看. 在前面的博文(Java集合框架源码(一)——hashMap)中我们详细讲了HashMap的原 ...

  5. 【java集合框架源码剖析系列】java源码剖析之TreeSet

    本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...

  6. 【java集合框架源码剖析系列】java源码剖析之HashSet

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于HashSet的知识. 一HashSet的定义: public class HashSet&l ...

  7. 【java集合框架源码剖析系列】java源码剖析之TreeMap

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于TreeMap的知识. 一TreeMap的定义: public class TreeMap&l ...

  8. 【java集合框架源码剖析系列】java源码剖析之ArrayList

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 本博客将从源码角度带领大家学习关于ArrayList的知识. 一ArrayList类的定义: public class Arr ...

  9. 【java集合框架源码剖析系列】java源码剖析之LinkedList

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识. ...

随机推荐

  1. 【BZOJ4195】 [Noi2015]程序自动分析

    Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或x ...

  2. .Net MVC JsonResult在IE下返回值变成下载文件问题

    昨天,有用户反馈公司的系统,一提交表单就变成了下载文件.匆匆忙忙地发现是IE浏览器(360兼容模式,不就是IE内核吗),返回Json格式的字符串变成了下载JSON文件.(代码如下) return Js ...

  3. yii2.0 curd操作数据写法

    一.执行原生sql查询,创建yii\db\Command         insert(),update(),delete()直接构建,相应的sql语句 查: 1.查询一条 \Yii::$app-&g ...

  4. 不能访问windows installer服务

    xp系统安装msi类型的安装程序出现以下错误: 不能访问windows installer服务. 解决办法 1:运行cmd -> regsvr32 msi.dll 运行services.msc- ...

  5. 使用collection:分段查询结果集

    1.在人员接口书写方法 public List<Employee> getEmpsByDeptId(Integer deptId); 2在人员映射文件中进行配置 <!-- publi ...

  6. VASP学习笔记--输入输出文件

    一.VASP 全称Vienna Ab-initio Simulation Package,是维也纳大学Hafner小组开发的进行电子结构计算和量子力学-分子动力学模拟软件包. 它是目前材料模拟和计算物 ...

  7. PushConsumer 消费消息

    CLUSTERING 模式下,消费者会订阅 retry topic // DefaultMQPushConsumerImpl#copySubscription private void copySub ...

  8. Centos 安装 FTP

    安装教程:   基于 CentOS 搭建 FTP 文件服务 搭建完成后,使用windows文件夹访问FTP报错,请确保输入的文件名是否正确,并且您有权访问此文件. 先确认ftp服务正常 修改:   设 ...

  9. oracle rman catalog--ORA-01580: error creating control backup file

    在测试rman catalog时,错误的设置了snapshot路径,报错 RMAN> show snapshot controlfile name; RMAN configuration par ...

  10. 【HBase】五、HBase的Java接口

      HBase是Hadoop中的一个重要组件,自然也是基于Java语言开发的,因此HBase有很好的Java接口供程序员调用,通过一个例子来演示java如何使用HBase数据库.   要想在HBase ...