Java后端程序员面经(1-1. Java基础之集合篇)

说明

本文主要基于面试中碰到的问题进行总结分析,可能不全。

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://www.importnew.com/7010.html

加分点

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相关

面试基本没有被问到,暂时不写

你可能感兴趣的:(java)