Java集合之深度剖析集合架构

本文参考自阿里孤尽老师的《码出高效代码》一书的第六章 , 为了节省大家学习时间 , 在这里对重要知识进行了总结 , 如果有知识点不明白的可以关注作者 , 找作者要相关的具体学习资料(免费送上) 。
一些大公司面试总会问一些JAVA集合相关的知识 , 如ArrayList实现原理、HashMap实现原理等 。所以作者准备做一个针对Java集合进行剖析的专题(后续几篇文章会全部围绕Java集合展开) 。
本篇文章没有对Java集合中的具体某个集合做详细剖析 , 只是让大家对Java集合有个宏观把控 , 为后面的学习做铺垫 。
Java集合架构图
Java集合之深度剖析集合架构

文章插图
Java集合框架图
如上图所示 , 框架图主要分为两大类 , 第一类是按照单个元素存储的Collection , 在继承树中List、Set及Queue都实现了Collection接口 , 第二类是按照Key-Value存储的Map 。以上两类集合体系 , 无论在数据存取还是遍历 , 都存在非常大的差异(图中灰色代表早期线程安全的类 , 目前基本已弃用) 。
List集合List集合是线性数据结构的主要实现 。常见List集合:ArrayList和LinkedList 。
  • ArrayList:容量可以改变的非线程安全集合 。采用数组作为内部存储方式 , 扩容时需要把原有数据复制到新数组中 。支持快速随机访问 , 但是插入或删除元素速度慢(这个过程可能需要移动其他元素) 。
  • LinkedList:双向链表 。插入和删除元素速度比ArrayList更快 , 但是随机访问速度比较慢 。实现了Queue接口(同时具备队列和栈的性质) 。优点:可以将内存中零散的空间通过引用的方式关联在一起 , 内存利用率高 。
Queue 集合Queue(队列)是一种先进先出的线性数据结构 , 只允许在一端进行获取操作 , 在另一端进行插入操作 。如BlockingQueue(阻塞队列)由于其FIFO和阻塞特性 , 在高并发场景下常常被作为Buffer(数据缓冲区)使用 。
Map 集合Map集合是以Key-Value键值对作为存储元素的哈希结构 , Key按照某种哈希函数计算后是唯一的 , Value则是可以重复的 。Map提供了keySet()、values()、entrySet()三种视图 , 分别用来查看所有key、value、键值对 。常见Map集合:HashMap、HashTable、ConcurrentHashMap、TreeMap 。
  • HashMap:非线程安全 , Key无序 。
  • HashTable:线程安全 , Key无序 。由于效率低 , 基本已被淘汰 。
  • ConcurrentHashMap:线程安全 , Key无序 。推荐多线程环境下使用 。
  • TreeMap:线程安全 , Key有序 。底层为树结构 , 在添加新元素到集合中时 , 按照某种比较规则将其插入合适位置 , 保证插入的集合是有序的 。
注:由于Map是哈希结构 , 在插入元素的时候会根据Key的哈希值匹配一个位置 , 不是按照插入顺序排列的 , 所以在无特殊处理的情况下是无序的 。
Set 集合Set集合是不允许重复元素的集合类型 。常见Set集合:HashSet、TreeSet、LinkedHashSet 。
  • HashSet: 内部使用HashMap实现 , 只是Value固定为一个静态对象 。
  • TreeSet: 内部使用TreeMap实现 。
  • LinkedHashSet: 继承自HashSet , 内部使用链表维护元素插入顺序 。
最后 , 希望读者通过本篇文章对Java集合有个整体认知 , 后续发布针对Java集合的使用规范 , 实现原理等层面进行剖析 , 让大家彻底搞懂Java集合!!!
END

【Java集合之深度剖析集合架构】


    推荐阅读