Java集合框架面试知识点总结

Java集合框架面试知识点总结

2019/10/26 周六


集合框架是面试中最常问到的问题之一,写一篇常用集合总结来加深记忆。

Java集合框架主要由两个根接口Collection和Map派生出来,其中Collection是把数据作为一组对象存储,由它又派生出了List、Set和Queue三个子接口;而Map是以key-value键值对的方式,可以存储具有映射关系的数据。

List接口

List是有序集合,内存空间连续,默认按元素的添加顺序设置索引;它允许有重复值

ArrayList
  1. 顺序结构,底层是一个动态数组
  2. 线程不安全,效率高
  3. 允许有null值
  4. (与LinkedList相比)因为有下标,所以查询快,但增删相对慢
  5. 初始容量为10,每次进行1.5倍扩容
LinkedList
  1. 链式结构,底层是一个双向链表,它的底层实现为 节点(node)+下一个节点的引用(next/pre)
  2. 线程不安全,效率高
  3. 允许有null值
  4. (与ArrayList相比)因为可以根据链表中的节点快速操作,所以插入删除操作快,查询相对慢
  5. 没有初始容量和扩容机制
  6. 与ArrayList相比有,它还有几个特有方法:addFirst()/addLast()、removeFirst()/removeLast()、getFirst()/getLast()
  7. LinkedList除了是List的实现类,还是Deque接口的实现类
Vector

Vector与ArrayList相似,它的特点和操作与ArrayList几乎一样,不同的是

  1. Vector是同步的,因此它是线程安全的动态数组,效率低
  2. 初始容量也是10,但每次进行2倍扩容
    Vector还有一个子类Stack,它的底层基于链表,是一个 后进先出(LIFO) 的堆栈;它还提供几个额外的方法:(1)push()入栈 (2)pop()出栈 (3)peek()取栈顶值但不出栈

Set接口

List是散列结构(底层是Map),内存空间不连续,因此没有顺序;它不允许有重复值

HashSet
  1. 底层数据结构为哈希表
  2. 内存存储位置由hashcode()方法决定
  3. 因为不允许有重复值,通过equals()方法判断是否重复(如果重复的话,新元素不会被加入,留下的是原来的那个元素)
  4. 允许有null值(但因为不重复,因此null值最多只有一个)
    HashSet还有一个子类LinkedHashSet,它的底层数据结构是链表加哈希表,链表使它变成了有序的集合,按插入顺序排序。
TreeSet(实现了SortedSet接口)
  1. 底层数据结构是红黑树
  2. 因此是有序的
  3. 主要作用就是可以排序(自然排序)

关于Comparable接口和Comparator接口的区别

  1. Comparable位于java.lang包,Comparator位于java.util包
  2. Comparable是自然排序,Comparator是比较器排序
  3. Comparable只包含一个comparaTo()方法,Comparator包含compare()和equals()方法
  4. Comparator比较器排序优先

Queue接口

  1. Queue是先进先出(FIFO)的队列,底层是线性结构
  2. 它的特有方法有(1)offer()添加 (2)poll()删除 (3)peek()查看队列头部元素
    Queue还有一个子接口Deque,它是一个双端队列,还可以当作来使用,因此它也有push()和pop()方法

此外,上面提到过,LinkedList除了是List的实现类,还是Deque的实现类

Map

Map以key-value形式存储数据,key不允许重复

HashMap
  1. 继承自AbstractMap类
  2. 底层数据结构为哈希表,以hash值配合数组+链表的形式实现,底层是一个数组(Entry[]数组,包含key、value、next等数学),数组中的每一项是一条链表
  3. 无序
  4. 线程不安全,效率高
  5. key和value都允许有null值,但因为key不能重复,因此key最多只有1个null值
  6. 通过hashcode()和equals()方法确保key的唯一性
  7. 初始容量16,扩容因子为0.75(当元素个数超过容量长度的75%时就进行扩容),每次扩容为原来的2倍,使用resize()方法扩容
    它有一个子类LinkedHashMap,底层在哈希表的基础上再加了一条链表,因此可以实现有序,按插入顺序排序
HashTable
  1. 继承自Dictionary类
  2. 底层数据结构为哈希表
  3. 无序
  4. 与HashMap最主要的区别,HashTable是线程安全的,适合多线程环境,效率低
  5. key和value都不允许为null
  6. 初始容量为11,扩容因子也是0.75,每次扩容为2倍+1
TreeMap(实现了SortedMap接口)
  1. 底层数据结构是红黑树
  2. 因此是有序的,根据key排序
  3. 也因此key不能为null
  4. 主要作用是用来排序(自然排序)
ConcurrentHashMap
  1. 机制:锁分离,在HashMap的基础上,将数据分段存储,由多个Segment组成,每个Segment都有锁,因此也是线程安全
  2. 底层:Segment数组+HashEntry数组,Segment继承于可重入锁,HashEntry是一个链式结构,用于存储键值对数据
  3. 作用:专门用于解决并发问题
  4. 线程安全,效率低
  5. 无序
  6. key和value都不允许为null

你可能感兴趣的:(基础知识)