双向查找 Map - BiMap
# 双向查找 Map - BiMap
简介
BiMap 是 Hutool 提供的一种双向查找的 Map 实现。与常规的 Map 不同,BiMap 支持通过键查找值,也支持通过值反向查找键。类似于 Guava 中的 BiMap,Hutool 的 BiMap 也要求键和值都唯一。若有重复的键或值,覆盖规则取决于所使用的底层 Map 实现。
# 1. 使用场景
BiMap 在需要快速通过键查找值、或者通过值反向查找键的场景中非常有用。例如,在需要维护双向映射关系(如用户名和用户 ID 互查)时,BiMap 能显著简化代码逻辑。
# 2. 主要方法
# 2.1 构造方法
BiMap 支持通过指定的 Map 实现来创建实例,如 HashMap、LinkedHashMap 等。
BiMap(Map<K, V> map):使用指定的Map作为底层实现,创建一个BiMap实例。
# 示例:创建 BiMap
import cn.hutool.core.map.BiMap;
import java.util.HashMap;
public class BiMapExample {
public static void main(String[] args) {
// 使用 HashMap 作为底层实现创建 BiMap
BiMap<String, Integer> biMap = new BiMap<>(new HashMap<>());
// 添加键值对
biMap.put("aaa", 111);
biMap.put("bbb", 222);
// 根据键查找值
System.out.println("根据键 'aaa' 查找值: " + biMap.get("aaa")); // 111
// 根据值反向查找键
System.out.println("根据值 222 查找键: " + biMap.getKey(222)); // bbb
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- 参数说明:
map: 用于构建BiMap的底层Map实现。
- 作用:创建一个支持双向查找的
BiMap,可以根据具体需求选择合适的Map实现。 - 实际开发场景:在需要双向查找功能时,如维护键值对的相互映射关系(如编码和描述),可以使用
BiMap。
# 2.2 插入与获取元素
BiMap 提供了 put 方法插入键值对,并通过 get 和 getKey 方法分别实现正向查找和反向查找。
# 示例:插入与获取元素
import cn.hutool.core.map.BiMap;
import java.util.HashMap;
public class BiMapExample {
public static void main(String[] args) {
// 创建 BiMap
BiMap<String, Integer> biMap = new BiMap<>(new HashMap<>());
// 添加键值对
biMap.put("aaa", 111);
biMap.put("bbb", 222);
// 根据键查找值
Integer value = biMap.get("aaa");
System.out.println("键 'aaa' 对应的值: " + value); // 111
// 根据值反向查找键
String key = biMap.getKey(111);
System.out.println("值 111 对应的键: " + key); // aaa
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 方法签名:
V put(K key, V value):插入键值对。V get(K key):根据键查找值。K getKey(V value):根据值反向查找键。
- 参数说明:
key: 插入的键,或用于查找的键。value: 插入的值,或用于反向查找的值。
- 返回值:
put方法返回被覆盖的旧值(如果存在)。get和getKey方法返回查找到的值或键。
- 作用:实现键值对的插入和双向查找,支持通过键查找值或通过值查找键。
- 实际开发场景:在应用中,经常需要通过某个唯一标识符快速获取其对应的值,如用户 ID 和用户名之间的映射关系。
# 3. 处理键或值重复的情况
当 BiMap 中的键或值重复时,覆盖的规则由底层的 Map 实现决定。例如,在使用 HashMap 时,若键重复则新值覆盖旧值;若值重复,则具体的覆盖顺序可能不确定。
# 示例:处理键或值重复的情况
import cn.hutool.core.map.BiMap;
import java.util.HashMap;
public class BiMapExample {
public static void main(String[] args) {
// 创建 BiMap
BiMap<String, Integer> biMap = new BiMap<>(new HashMap<>());
// 添加重复的键
biMap.put("aaa", 111);
biMap.put("aaa", 222); // 新值 222 覆盖旧值 111
// 添加重复的值
biMap.put("bbb", 222);
biMap.put("ccc", 222); // 具体哪个键会被保留取决于底层 Map 实现
// 打印结果
System.out.println("BiMap 内容: " + biMap); // {aaa=222, ccc=222}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 作用:展示在键或值重复的情况下,
BiMap的行为。了解底层Map的特性有助于在开发中正确使用BiMap。
# 4. 实际应用场景
- 双向映射:在需要维护键值对之间的相互映射关系时,
BiMap是一种简洁高效的解决方案。 - 双向查找:当需要根据值反向查找键时,可以使用
BiMap,避免使用两个Map维护双向关系。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08