说明
本文主要基于面试中碰到的问题进行总结分析,可能不全。
Map相关
基础点
1. HashMap数据结构,即table+单链表(jdk8后,在节点超过TREEIFY_THRESHOLD时,会将单链表转换为红黑树)
2. HashMap不是线程安全的,一般是指多个线程同时resize过程中,会导致死循环,详见:http://www.importnew.com/22011.html。
进阶点
1. 线程安全地使用Map有哪些方式,即ConcurrentHashMap[我了解到的较好的方式]、Map m = Collections.synchronizedMap(new HashMap())[对每个操作都synchronized (mutex)]、Hashtable[这个我自己基本没有使用过]。
2. 对比Hashtable和HashMap
2-1. Hashtable的方法是synchronized的,HashMap的方法不是,单线程环境前者比后者慢。
2-2. Hashtable中,key和value都不允许出现null值。在HashMap中可以。
2-3. 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
2-4. 初始大小和扩容的方式不同。HashTable中hash数组默认大小是11,增加的方式是 *2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
2-5. HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。详见:http:
加分点
1. 线程安全地使用Map的各种方式如何实现线程安全的
1-1. ConcurrentHashMap,分段锁,通过对table段采用不同的锁,减小锁粒度,提高并发量
1-2. Collections.synchronizedMap,对HashMap的所有操作加锁
1-3. Hashtable,内部方法都是synchronized的
2. 详细了解以上各个类的内部实现
2-1. HashMap的get,put方法实现代码,构造方法有哪些,常用参数的默认值
2-2. ConcurrentHashMap的上述方法及参数设置源码
Set相关
面试基本没有被问到,暂时不写
List相关
面试基本没有被问到,暂时不写