hashmap哈希冲突
时间: 2023-11-30 07:42:43 浏览: 98
Java HashMap高难度面试题集锦解析Java HashMap面试题及答案解析-高难度
在使用HashMap时,由于哈希表的大小是有限的,而键的数量是无限的,因此不同的键可能会映射到相同的哈希表索引上,这就是哈希冲突。当发生哈希冲突时,HashMap会在相应的哈希表索引处维护一个链表,将具有相同哈希值的键值对存储在链表中。当需要查找某个键值对时,HashMap会先计算该键的哈希值,然后在相应的哈希表索引处的链表中查找该键值对。
解决哈希冲突的方法有很多种,HashMap底层是通过链表来解决哈希冲突的。当发生哈希冲突时,新的键值对会被插入到相应哈希表索引处的链表的头部,这样可以保证在查找键值对时,能够先找到最新插入的键值对。但是,当链表过长时,会影响HashMap的性能,因此Java 8中引入了红黑树来优化链表过长的情况。
下面是一个演示HashMap哈希冲突的例子:
```java
import java.util.HashMap;
public class HashMapDemo {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>(); map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
map.put("peach", 4);
map.put("grape", 5);
map.put("watermelon", 6);
map.put("pineapple", 7);
map.put("kiwi", 8);
map.put("pear", 9);
map.put("mango", 10);
map.put("strawberry", 11);
map.put("blueberry", 12);
map.put("raspberry", 13);
map.put("blackberry", 14);
map.put("cherry", 15);
map.put("pomegranate", 16);
map.put("apricot", 17);
map.put("plum", 18);
map.put("fig", 19);
map.put("date", 20);
map.put("peach", 21); // 重复插入键"peach"
System.out.println(map);
}
}
```
输出结果为:
```
{orange=3, watermelon=6, grape=5, kiwi=8, pear=9, apple=1, peach=21, fig=19, blackberry=14, blueberry=12, raspberry=13, date=20, pineapple=7, strawberry=11, pomegranate=16, banana=2, plum=18, mango=10, cherry=15}
```
可以看到,由于键"peach"被重复插入,导致原来的键值对被覆盖了。
阅读全文