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/

 

最新文章

  1. 20161023 NOIP 模拟赛 T1 解题报告
  2. 转载:scala中:: , +:, :+, :::, ++的区别
  3. 深度分析Linux下双网卡绑定七种模式 多网卡的7种bond模式原理
  4. 使用python递归子目录处理日志文件
  5. ASCII码详解
  6. Checkbox框全选操作,form表单提交与jquery ajax提交两种处理方式
  7. javascript学习教程之---如何从一个tab切换到banner幻灯片的转换2
  8. svn branch 的使用
  9. 5.0、Android Studio调试你的应用
  10. node服务端口被占用Error listen EADDRINUSE :::3000
  11. LinuxMint 下 B站 番 blv 缓存 转 mp4
  12. 将选中项的value值赋给select的title
  13. wordpress评论回复自动发邮件的功能
  14. Sybase采用load table加载文本数据中的部分字段数据
  15. vue router history模式开发ngnix配置
  16. sqlite3 新增数据
  17. Maven知识整理
  18. python连接RabbitMQ
  19. DXP常用有效的快捷操作记录
  20. codevs 1013 求先序排列

热门文章

  1. Java对数组和列表的排序1.8新特性
  2. 【转】Python Schema一种优雅的数据验证方式
  3. 《Effective Java》读书笔记 - 2.创建和销毁对象
  4. 1、安装Scrapy
  5. chrome查看JavaScript的堆栈调用
  6. HTTP缓存初识
  7. 使用js如何获取treeview控件的当前选中的节点
  8. C#程序自动安装数字证书
  9. 安装Mantis出现的一些问题解决
  10. 系统分析与设计HW4