面试题-Java集合(新更新版本)
前言
Java集合部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,希望对大家起到一定的帮助。
Java集合
Java集合
-
说说Arraylist 与 LinkedList 区别?
ArrayList的底层数据结构是数组,LinkedList的底层数据结构是链表。
问题的本质其实是数组和链表的区别:
- 查找方面:按值查找的话,数组和链表的时间复杂度都是O(N);按索引查找的话,数组的时间复杂度是O(1),链表的时间复杂度是O(N)
- 插入和删除方面:数组的插入和删除因为需要移动数据,所以平均时间复杂度为O(N);链表为O(1)
-
说⼀说 ArrayList 的扩容机制?
按照1.5倍的长度来创建一个新的数组,然后把原始数据拷贝过去。
在实际开发中,如果插入的数据量较大,可以使用ensureCapacity提前扩容到指定大小,来提高性能。
-
HashSet的底层实现?
HashSet底层用的就是HashMap实现的,key存储实际的对象,value存储一个默认的Object
-
说一说HashMap的底层数据结构 和 扩容机制
- Jdk1.8以前,是数组+链表;1.8以后,是数组+链表或者红黑树;当链表长度达到8时,会转变为红黑树,目的是为了提高按照值查找时的时间复杂度,从链表的O(N)提高到红黑树的O(logN)
- 默认初始化一个长度为16的数组,当 键值对个数 > 数组长度 * 负载因子时 就会进行扩容,扩容至原始长度的2倍。
-
HashMap的长度为什么是2的幂次方?
hash值需要根据数组实际长度进行取模运算从而找到索引位置,如果是2的幂次方,可以把取模运算转化为位运算,提高性能。h%length == h&(length-1)
-
HashMap和Hashtable的区别?
HashMap不是线程安全的,当rehash时可能会形成环形链表;HashTable是线程安全的,实现机制是加sync锁
HashTable不允许存Null的key和value,HashMap则可以。
-
ConcurrentHashMap 和 Hashtable 的区别?
ConcurrentHashMap在1.7之前,使用分段锁来提高并发度;1.8之后,使用sync+CAS来实现线程安全,并且只锁定链表的头部,效率比分段锁又有所提高。