双向查找 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