1. 你用过HashMap吗, 什么是HashMap? 为什么用到它?
用过, 然后可以接着回答一些HashMap的特性, 比如HashMap可以接收null键值和值, 而HashTable则不能, HashMap是非synchronized的; HashMap很快, 以及HashMap存储的是键值对等.
2. 你知道HashMap的工作原理吗? 你知道HashMap的get() 方法的工作原理吗?
HashMap是基于hashing的原理, 我们使用put(key, value) 存储对象到HashMap中, 使用get(key) 从HashMap中获取对象, 当我们给put() 方法传键和值时, 我们先对键调用hashCode()方法, 返回的hashCode用于找到bucket的位置来存储entry对象.
这里关键点在于指出, HashMap是在bucket中存储键对象和值对象, 作为Map.Entry 这一点有助于理解获取对象的逻辑. 如果你没有意识到这一点, 或者错误的认为仅仅只在bucket中存储值的话, 你将不会回答如何从HashMap中获取对象的逻辑.
3. 当两个对象的hashCode相同会发生什么?
这个问题一般是分界点了. 一般同学都会回答, 因为hashCode相同, 所以两个对象是相等的, HashMap将会抛出异常, 或者不会存储它们.
这个时候, 如果面试官对你之前的回答比较满意, 可能会提醒你他们有equals()和hashCode(0两个方法, 并告诉他们两个对象就算hashCode相同, 但是他们可能并不相等. 如果掌握的不太好, 可能这个问题就会不了了之.
而这个题的答案是: 因为hashCode相同, 所以他们的bucket位置相同, 碰撞会发生, 因为HashMap使用链表存储对象, 这个Entry(包含有键值对的Map.Entry)会存储在链表中, 这个时候要根据hashCode来划分数组, 如果数组的坐标相同, 则进入链表这个数据结构中了, 一般的添加都在最前面, 也就是和数组下标直接相连的地方, 链表长度到达8的时候, JDK1.8上升为红黑树. 这样回答基本就ok了, 要不要