在我们创建HashMap对象的时候,底层会创建一个长度为16,默认加载因子为0.75的数组,我们在调用put方法添加数据的时候,底层会创建一个Entry对象,Entry对象里就是要添加的键值对,然后利用键计算哈希值(与值无关)。再计算出在数组当中应该存入的索引,如果索引位置为null,则直接添加,如果不是null,会调用equals方法比较键的属性值,如果属性值一样会直接覆盖原来的Entry对象,这也是put方法的底层原理。如果属性值不一样,会添加新的Entry对象,在JDK8以前,新的对象会添加到数组中,原来的元素会挂在新元素的下面形成链表,在JDk8以后,新的元素的挂在原有元素的下面形成链表,当链表长度>8并且数组长度>=64的时候会自动转成红黑树。

总结:

  1. HashMap底层是哈希表结构的(哈希表:数组+链表+红黑树)
  2. 依赖hashcode和equals方法保证了键的唯一
  3. 如果键存储的是自定义对象,需要重写hashcode和equals方法,如果值存储的是自定义对象则不需要重写。