这里写目录标题
概述
集合框架是Java中用于存储数据的容器,是面试中的常客,接下来我从面试的角度对常见的集合框架面试题进行一些解析。
面试题解析
常用的集合类有哪些?
Map接口和Collection接口是所有集合框架的父接口:
Collection接口的子接口包括:Set接口和List接口
Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
了解Java的集合框架吗,口述一下他们的继承体系
List,Set,Map三者的区别?
List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。
Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。
Map是一个键值对集合,存储键、值和之间的映射。 Key无序,唯一;value 不要求有序,允许重复。Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
Map 的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap,其中HashTable只作为了解即可,目前已经不再使用。
说一说他们的底层数据结构是什么
Collection
1、List
Arraylist :底层使用的是Object数组;
LinkedList :底层使用的是双向链表数据结构(JDK1.6之
前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别:);
vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用;
statck:对vector进行进出限制,堆栈类,先进后出。
2、Set
HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素;
LinkedHashSet: LinkedHashSet 继承于 HashSet,并且其内部是通过 LinkedHashMap 来实现的;
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树。
Map
1、HashMap:JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间;
2、HashTable:Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 数组+链表 的形式,但它是HashMap的线程安全版本,它使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低;
3、TreeMap: 红黑树(自平衡的排序二叉树);
4、LinkedHashMap:LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑;
5、Concu