Java集合框架面试知识点总结
2019/10/26 周六
集合框架是面试中最常问到的问题之一,写一篇常用集合总结来加深记忆。
Java集合框架主要由两个根接口Collection和Map派生出来,其中Collection是把数据作为一组对象存储,由它又派生出了List、Set和Queue三个子接口;而Map是以key-value键值对的方式,可以存储具有映射关系的数据。
List接口
List是有序集合,内存空间连续,默认按元素的添加顺序设置索引;它允许有重复值。
ArrayList
- 顺序结构,底层是一个动态数组
- 线程不安全,效率高
- 允许有null值
- (与LinkedList相比)因为有下标,所以查询快,但增删相对慢
- 初始容量为10,每次进行1.5倍扩容
LinkedList
- 链式结构,底层是一个双向链表,它的底层实现为 节点(node)+下一个节点的引用(next/pre)
- 线程不安全,效率高
- 允许有null值
- (与ArrayList相比)因为可以根据链表中的节点快速操作,所以插入删除操作快,查询相对慢
- 没有初始容量和扩容机制
- 与ArrayList相比有,它还有几个特有方法:addFirst()/addLast()、removeFirst()/removeLast()、getFirst()/getLast()
- LinkedList除了是List的实现类,还是Deque接口的实现类
Vector
Vector与ArrayList相似,它的特点和操作与ArrayList几乎一样,不同的是
- Vector是同步的,因此它是线程安全的动态数组,效率低
- 初始容量也是10,但每次进行2倍扩容
Vector还有一个子类Stack,它的底层基于链表,是一个 后进先出(LIFO) 的堆栈;它还提供几个额外的方法:(1)push()入栈 (2)pop()出栈 (3)peek()取栈顶值但不出栈
Set接口
List是散列结构(底层是Map),内存空间不连续,因此没有顺序;它不允许有重复值。
HashSet
- 底层数据结构为哈希表
- 内存存储位置由hashcode()方法决定
- 因为不允许有重复值,通过equals()方法判断是否重复(如果重复的话,新元素不会被加入,留下的是原来的那个元素)
- 允许有null值(但因为不重复,因此null值最多只有一个)
HashSet还有一个子类LinkedHashSet,它的底层数据结构是链表加哈希表,链表使它变成了有序的集合,按插入顺序排序。
TreeSet(实现了SortedSet接口)
- 底层数据结构是红黑树
- 因此是有序的
- 主要作用就是可以排序(自然排序)
关于Comparable接口和Comparator接口的区别
- Comparable位于java.lang包,Comparator位于java.util包
- Comparable是自然排序,Comparator是比较器排序
- Comparable只包含一个comparaTo()方法,Comparator包含compare()和equals()方法
- Comparator比较器排序优先
Queue接口
- Queue是先进先出(FIFO)的队列,底层是线性结构
- 它的特有方法有(1)offer()添加 (2)poll()删除 (3)peek()查看队列头部元素
Queue还有一个子接口Deque,它是一个双端队列,还可以当作栈来使用,因此它也有push()和pop()方法
此外,上面提到过,LinkedList除了是List的实现类,还是Deque的实现类
Map
Map以key-value形式存储数据,key不允许重复
HashMap
- 继承自AbstractMap类
- 底层数据结构为哈希表,以hash值配合数组+链表的形式实现,底层是一个数组(Entry[]数组,包含key、value、next等数学),数组中的每一项是一条链表
- 无序
- 线程不安全,效率高
- key和value都允许有null值,但因为key不能重复,因此key最多只有1个null值
- 通过hashcode()和equals()方法确保key的唯一性
- 初始容量16,扩容因子为0.75(当元素个数超过容量长度的75%时就进行扩容),每次扩容为原来的2倍,使用resize()方法扩容
它有一个子类LinkedHashMap,底层在哈希表的基础上再加了一条链表,因此可以实现有序,按插入顺序排序
HashTable
- 继承自Dictionary类
- 底层数据结构为哈希表,
- 无序
- 与HashMap最主要的区别,HashTable是线程安全的,适合多线程环境,效率低
- key和value都不允许为null
- 初始容量为11,扩容因子也是0.75,每次扩容为2倍+1
TreeMap(实现了SortedMap接口)
- 底层数据结构是红黑树
- 因此是有序的,根据key排序
- 也因此key不能为null
- 主要作用是用来排序(自然排序)
ConcurrentHashMap
- 机制:锁分离,在HashMap的基础上,将数据分段存储,由多个Segment组成,每个Segment都有锁,因此也是线程安全的
- 底层:Segment数组+HashEntry数组,Segment继承于可重入锁,HashEntry是一个链式结构,用于存储键值对数据
- 作用:专门用于解决并发问题
- 线程安全,效率低
- 无序
- key和value都不允许为null