📜  如何在 hashmap 中插入重复键 (1)

📅  最后修改于: 2023-12-03 15:38:16.246000             🧑  作者: Mango

如何在 HashMap 中插入重复键

HashMap 是 Java 中常用的数据结构之一,它允许我们将键值对存储在一起,以便于高效的访问和管理。在 HashMap 中,每个键都必须是唯一的,否则就会出现冲突。

但是有时候我们需要在 HashMap 中插入重复键,本文将介绍如何实现这种操作。

1. 什么是 HashMap

HashMap 是一种哈希表实现,它是由数组和链表或红黑树等数据结构组成的。在 HashMap 中,键和值都是对象,并且它们可以为 null。当插入一个新的键值对时,首先通过哈希函数计算出键的哈希值,然后将键值对插入到对应的槽位中。如果一个槽位中已经存在了键值对,那么就需要采取一些策略来处理冲突。

2. HashMap 的工作原理

在 HashMap 中,键的哈希值决定了对象的存储位置。当我们调用 put() 方法向 HashMap 中插入一个新的键值对时,会按照以下步骤进行:

  1. 计算键的哈希值;
  2. 根据哈希值找到键的存储位置;
  3. 如果该位置为空,则直接插入键值对;
  4. 如果该位置已经存在键值对,则需要采用一些策略来处理冲突。

在 HashMap 中,处理冲突的方法有两种:开放寻址法和链地址法。在链地址法中,每个位置都会保存一个链表,如果发生冲突,则新的键值对会被加入到链表的末尾,而在开放寻址法中,如果发生冲突,就会寻找一个空的位置来存放键值对。

3. 如何在 HashMap 中插入重复键

由于 HashMap 要求键必须唯一,因此我们不能直接使用 put() 方法插入重复的键。但是,我们可以使用 putIfAbsent() 方法来插入一个新的键值对,并且如果该键已经存在,则不会插入它。

下面是一个示例代码:

Map<String, Integer> map = new HashMap<>();

// 向 map 中插入两个相同的键
map.put("key", 1);
map.putIfAbsent("key", 2);

System.out.println(map);

输出结果为:

{key=1}

从结果可以看出,第二个 putIfAbsent() 方法并没有插入新的键值对,因为该键已经存在。

另外,如果我们想要插入多个具有相同键的键值对,可以使用链表或者其他的数据结构来保存它们。下面是一个示例代码:

Map<String, List<Integer>> map = new HashMap<>();
String key = "key";

// 在 map 中插入两个相同的键
if (map.containsKey(key)) {
    map.get(key).add(1);
    map.get(key).add(2);
} else {
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    map.put(key, list);
}

System.out.println(map);

输出结果为:

{key=[1, 2]}

从上述代码可以看出,我们将键的值设为一个 List,这样就可以保存多个具有相同键的键值对了。

4. 总结

在 Java 中,HashMap 是非常常用的数据结构之一。当我们需要在 HashMap 中插入重复键时,可以使用 putIfAbsent() 方法来实现。如果我们需要插入多个具有相同键的键值对,可以使用链表或其他数据结构来保存它们。