Java集合框架是Java设计者非常重要的一个设计灵感体现。相对数组,Java提供的集合框架是非常高效且方便的,同时也易于操作。根据我们平时书写代码的频率以及面试时经常被问到的知识点里,都不可或缺的提到集合框架,好多同学其实都学过集合框架,但是用的时候却发现自己从没仔细想过,我为什么要用这个集合呢?以及集合框架之间的区别到底是什么呢?
![62885024fe054a11b1a76fd7d661e4f6.png](https://i-blog.csdnimg.cn/blog_migrate/39d104eb1a51d8c72ad09905e46195cb.jpeg)
今天,我就在这里和大家简单的聊聊Java的三大集合框架
1、Java集合框架图
![d4a7f29ca2ce92b5408be72c264e3589.png](https://i-blog.csdnimg.cn/blog_migrate/e81adfa986f6b5ff2461992ff1867658.jpeg)
Java集合框架简图
从这个图中我们可以看到Java集合框架的组成以及他们之间的关系,其中有四大接口,如下:
Collection 接口:存储一组不唯一,无序的对象
List 接口:存储一组不唯一,有序(索引顺序)的对象
Set 接口:存储一组唯一,无序的对象
Map接口:存储一组键值对象,提供key到value的映射
--- Key 唯一 无序
--- value 不唯一无序
接口之下都是接口对应的实现类,也是我们经常使用的集合框架类。
2、常用集合类比较
List类和Set类
List类和Set类是Collection集合接口的子接口。
Set子接口:无序,不允许重复。
List子接口:有序,可以有重复元素。
Set和List对比
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
Set和List具体子类
Set
|————HashSet:以哈希表的形式存放元素,插入删除速度很快。
|————LinkedHashSet:采用哈希表存储结构,同时使用链表维护次序。
|————TreeSet:采用二叉树(红黑树)的存储结构。
List
|————ArrayList:动态数组
|————LinkedList:链表、队列、堆栈。
Map接口
Map接口是独立的一个接口,与Collection接口没有关系。
特点是:数据是 key-value 映射
具体子类:
|———— HashMap
Key 无序 唯一 (Set)
Value 无序 不唯一 (Collection)
|———— LinkedHashMap
有序的HashMap 速度快
|———— TreeMap
有序 速度没有hash快
注意:HashSet底层结构其实就是调用HashMap
3、如何应对面试中关于集合框架的问题呢?
(1)、从线程安全方面比较
线程安全就是说多线程访问同一代码,不会产生不确定的结果。集合框架之间的区别和比较的一个点,也就是包括是否线程安全,一般情况下,线程安全就必定速度或效率相对就低,这是由设计决定的。
线程安全集合类与非线程安全集合类
LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。
(2)、从适用场景比较
对于查找和删除较为频繁,且元素数量较多的应用,Set或Map是更好的选择;
ArrayList适用于通过为位置来读取元素的场景;
LinkedList 适用于要头尾操作或插入指定位置的场景;
Vector 适用于要线程安全的ArrayList的场景;
Stack 适用于线程安全的LIFO场景;
HashSet 适用于对排序没有要求的非重复元素的存放;
TreeSet 适用于要排序的非重复元素的存放;
HashMap 适用于大部分key-value的存取场景;
TreeMap 适用于需排序存放的key-value场景。
最后附上集合框架比较的详细图
![ff74019972f9443ff1046c6e5b10c279.png](https://i-blog.csdnimg.cn/blog_migrate/c5b5bd025996d6c96a8808ed87298a38.jpeg)
集合框架不要死记硬背,一定要理解他们的数据结构及底层实现原理,实际工作中,我们常用的也就那么几个,只是面试过程中,会经常被问到它们之间的区别和差异!
好啦!今天就写到这里,有对集合框架不同看法和意见的同学,也可以给我留言!谢谢!