1. Map 的面试题分类
- HashMap的数据结构,面试官考察的是对 Map 内部的存储结构了解;
- HashMap 的增删查改操作,面试官考察的是对 map 内部操作流程的熟悉程度,既要知其然,还要知其所以然;
- HashMap 的应用,面试官考察的是灵活运用HashMap的能力。
- 其他Map类面试题,面试官考察的是系统掌握Map类的能力。
2.经典面试题
- Java 集合你有了解么?平常项目比较常用的集合类有哪些?
HashMap 和 ArrayList。
- 那你知道 HashMap 内部的数据结构吗?
各个版本的实现略有不同。JDK1.7 及以前的 HashMap 采用数组 + 链表的结构来存储数据; JDK8 中的 HashMap 采用了数组 + 链表或树的结构来存储数据。
- HashMap 的存储数据的过程是什么样的?
不同的 JDK 版本版本的存储过程略有差异。在 JDK1.8 中,HashMap 存储数据的过程可以分为以下几步:
1. 对 key 的 hashCode () 进行 hash 后计算数组获得下标 index;
2. 如果当前数组为 null,进行容量的初始化,初始容量为 16;
3. 如果 hash 计算后没有碰撞,直接放到对应数组下标里;
4. 如果 hash 计算后发生碰撞且节点已存在,则替换掉原来的对象;
5. 如果 hash 计算后发生碰撞且节点已经是树结构,则挂载到树上。
6 / 如果 hash 计算后发生碰撞且节点是链表结构,则添加到链表尾,并判断链表是否需要转换成树结构
(默认大于 8 的情况会转换成树结构);
- 完成 put 后,是否需要 resize () 操作(数据量超过 threshold,threshold 为初始容量和负载因子之积,默认为 12)。
而在 1.7 的版本中,5/6 是合在一起的,即如果发生哈希碰撞且节点是链表结构,则放在链表头。
- 如果 hashCode 相同,如何获取对象呢?
hashCode 相同,说明这些对象的数据都在同一个数组下标对应的链表或者树上。get 方法的签名是 V get (Object key) ,入参只有一个 key,因此通过遍历链表或者树,取出每一个节点对比 hash 值是否相等且 key 是否相等 (= 或者 equals)。
- HashMap 和 HashTable 有什么区别?
HashMap 是 JDK1.2 才出现的;HashTable 是 JDK1.0 就出现的。JDK 里面也说了 HashMap 可以大致相当于 HashTable(The HashMap class is roughly equivalent to Hashtable, except that it is
unsynchronized and permits nulls)。
至于具体的差异:
1.HashMap 是线程不安全的,HashTable 是线程安全的。
2.HashMap 的键需要重新计算对象的 hash 值,而 HashTable 直接使用对象的 hashCode。
3.HashMap 的值和键都可以为 null,HashTable 的值和键都不能为 null。
4.HashMap 的数组的默认初始化大小为 16,HashTable 为 11;HashMap 扩容时会扩大两倍,HashTable 扩大两倍 + 1;