一、HashMap底层的数据结构是什么吗?

答:HashMap的底层数据结构是数组+链表+红黑树

二、JDK 1.8中对hash算法和寻址算法是如何优化的

  1. // JDK 1.8以后的HashMap里面的一段源码
  2. static final int hash(Object key) {
  3. int h;
  4. return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

hash对n取模的效果与hash&(n-1)的效果是一样的,后者的性能更高

三、你知道HashMap是如何解决hash碰撞问题的吗?

答:hash冲突问题解决,链表+红黑树
假如链表很长,可能会导致遍历链表,性能会比较差,O(n)
链表很长后 优化,如果链表的长度达到了一定的长度之后,其实会把链表转换为红黑树,遍历一颗红黑树找一个元素,此时O(logn),性能会比链表高一些

四、说说HashMap是如何进行扩容的可以吗?

hashmap的长度满了后会2倍扩容,由于扩容后需要重新分配位置,会再次根据hash存放,如果hash中的二进制结果中是否多出一个bit的1,如果没多,那么就是原来的index,如果多了出来,那么就是index + oldCap(原来的长度),通过这个方式,就避免了rehash的时候,用每个hash对新数组.length取模,取模性能不高,位运算的性能比较高