Java集合之深度剖析集合架构
本文参考自阿里孤尽老师的《码出高效代码》一书的第六章,为了节省大家学习时间,在这里对重要知识进行了总结,如果有知识点不明白的可以关注作者,找作者要相关的具体学习资料(免费送上)。
一些大公司面试总会问一些JAVA集合相关的知识,如ArrayList实现原理、HashMap实现原理等。所以作者准备做一个针对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