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. UVa 11235 Frequent values (RMQ && 区间出现最多次的数的次数)

    题意 : 给出一个长度为 n 的不降序序列,并且给出 q 个形如(L, R)的问询,问你这个区间出现的最多次的数的次数. 分析 : 很自然的想到将区间“缩小”,例如1 1 2 3 3 3就可以变成2 ...

  2. 配置:Uri

    URI是网络资源的定义,代表了要操作的数据,Uri主要包含了两部分信息: 1>需要操作的ContentProvider  2>对ContentProvider中的什么数据进行操作   一个 ...

  3. Python黑科技 | Python中四种运行其他程序的方式

    在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32proc ...

  4. 【技术分享:python 应用之一】如何使用 Python 对 Excel 做一份数据透视表

    客户这边,其中有一张如同上图所示的数据汇总表,然而需求是,需要将这张表数据做一个数据透视表,最后通过数据透视表中的数据,填写至系统数据库.拿到需求,首先就想到肯定不能直接用设计器去操作 Excel,通 ...

  5. 浅谈javaweb三大框架和MVC设计模式

    一.MVC设计模式 1.MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(Vie ...

  6. libusb开发者指南

      本文档描述libusb的API,以及如何开发USB应用.1 介绍 1.1 概览本文档描述libusb-0.1的API和USB相关内容.1.2 当前OS支持Linux 2.2或以上FreeBSD/N ...

  7. gsensor架构和原理分析【转】

    本文转载自:http://blog.csdn.net/u012296694/article/details/48055491 本文主要描述了在android2.3平台G-sensor相关软硬件的体系架 ...

  8. heap和stack区别

    转载自博客:https://www.cnblogs.com/perfy/archive/2012/09/06/2672946.html 1.heap是堆 ,stack是栈 2.stack的空间由操作系 ...

  9. $.ajax函数调接口,报异常No converter found for return value of type: class java.util.ArrayList

    接口正常执行,返回给前端后报服务器500异常,异常详情: org.springframework.http.converter.HttpMessageNotWritableException: No ...

  10. HTML学习之==>DOM操作

    DOM(Document Object Model 文档对象模型) 一个web页面的展示,是由html标签组合成的一个页面,dom对象实际就是将html标签转换成了一个文档对象.可以通过dom对象中j ...