- jdk1.7底层是由数组+链表实现
- jdk1.8底层是由数组+链表+红黑树实现
以下都是数组+链表+红黑树对应的描述:
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("Aa", "Value1");
map.put("BB", "Value2");
System.out.println("Aa".hashCode()); // 输出: 2112
System.out.println("BB".hashCode()); // 输出: 2112
System.out.println(map.get("Aa")); // 输出: Value1
System.out.println(map.get("BB")); // 输出: Value2
}
- 当
HashMap
中存入"Aa"
和"BB"
这两个键时,由于它们的hashCode
相同,它们会被存储在HashMap
数组的同一个下标位置。 - 由于它们具有相同的哈希值,它们会被存储在同一个桶(bucket)中,并在该桶中的链表或红黑树中进行存储和管理。
- 链表如果过长查询效率又过于低下,这时又转化出了红黑树,而转化的条件是链表的长度大于8,数组的长度大于64就会自动转化出红黑树。
这也是HashMap
在遇到哈希冲突时的处理方式,保证了即使在哈希冲突发生的情况下,键值对依然能够正确存取。