Java 集合知识点的面试问题

1.Java中的集合分类

集合框架由Collection接口和Map接口组成。
其中Colelection接口中有两个子接口Set接口和List接口

主要的实现类有以下
Map接口:HashMap,TreeMap,HashTable,ConcurrentHashMap等
Set接口:HashSet,TreeSet,LinkHashSet等
List接口:ArrayList,LinkList,Vector,Stack
(List和Set的区别是一个是可以有元素,一个没有重复)

框架图(百度剽窃来的)
Java 集合知识点的面试问题
Java 集合知识点的面试问题

2.HashMap和HashTable的区别

1.HashMap线程不安全,HashTable线程安全,用Synchronized修饰方法。
2.HashMap允许key=null,HashTable不允许。

3.HashMap底层实现

JDK8之前是 数组+链表
JDK8之后是 数组+链表+红黑树

4.ConcurrentHashMap和HashTable的区别

ConcurrentHashMap集合了HashTable和HashMap的优点,即线程安全,同时效率比HashTable高
原因是ConcurrentHashMap的锁是更加细粒度,而HashTable的锁是锁住整个对象。
ConcurrentHashMap的锁是分离锁,读操作不加锁,写操作则是将整张表分离成不同的锁,所以允许多个写操作。

数据结构是采用segment进行分段(每一段一个锁),每一段作为一个HashTable,所以需要进行两次hash,第一次确定segment,第二次确定在HashTable中的位置。(最高的并发写操作线程数是segment段数)(jdk1.7)

jdk1.7和jdk1.8的实现方式不同
<jdk1.7>:数组(Segment) + 数组(HashEntry) + 链表(HashEntry节点)
<jdk1.8> : 使用 Node数组+链表+ 红黑树(锁是每个数组元素的链表头结点)

5.HashMap的长度为什么是2的幂次方

1.最大化空间利用率
元素映射方式是 hash&length-1,长度是2的幂次方,则length-1的二进制是1111…1的类型,也就是hash与之后得到的映射结果是在0到length-1之间都有可能,也就是HashMap的空间理论上是都可以利用,如果不是2的幂次方,二进制就会有0位,该位的&结果一定是0,无法映射到对应的位置为1的情况。浪费了空间。

2.速度快
如果 length 为 2 的次幂 则 length-1 转化为二进制必定是 11111……的形式,在于 h 的二进制与操作效率会非常的快

6.Comparable接口和Comparator接口的区别

1.Comparable接口是需要比较对象实现的接口,也就是需要改变源码。(形容词)
2.Compartor接口是作为一个比较器来实现的,不需要改变比较对象源码。(名词)