在了解HashMap相关面试题之前请先看HashMap的源码这样有助于你理解HashMap相关的面试题。

能否使用任何类作为 HashMap 的 key

可以。hashmap的key的计算源码

 static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

我们可以看出key的值和对象的hashCode值相关,所以可以用任何类作为map的key。

但是需要重写hashCode()方法,否则会造成内存泄漏,如何重写hashcode()和equals方法请参考这里

HashMap key是否可以为空

可以,从上面hash的代码中可以看出,当key为空值时,返回0。

为什么String、Integer适合作为Key

  • 因为它们都是final类型的,不可变更,能够减少hash碰撞的概率。
  • 内部已经重写了hashCode和equals方法,遵循hashmap的key原则。

参考: Java如何重写equals和hashCode方法

HashMap如何解决hash冲突的

要回答这个问题,首先得知道hashmap的内存结构和hashmap的put过程。

hashmap的内存结构是由散列表(数组)和链表组成,散列表值是由hashCode计算出来的,当出现相同的hash值时,即hash冲突,就把它放到一个链表中。

如果链表中的长度大于8且数组的长度大于64,就把这个链表变为一个红黑树

如果红黑树的节点小于6时,重新转为链表。

HashMap在jdk1.7和1.8有什么不同

jdk1.7中没有红黑树,只有散列表和链表。

jdk1.8中有红黑树,根据链表的大小判断链表是否转为红黑树。