Google Guava库提供了大量高效、有用的Java工具类,其中BiMap是一种非常独特的映射结构。与传统的Map不同,BiMap保证了键和值都是唯一的,因此它提供了键到值以及值到键的双向映射。这种数据结构在处理需要双向查找的场景时非常有用。
BiMap,全称Bidirectional Map,即双向映射,是一种特殊的数据结构,它可以同时支持根据键查找值和根据值查找键的操作,这意味着在BiMap中,不仅键是唯一的,值也必须是唯一的。BiMap接口扩展了Map接口,并添加了一些方法来提供反向视图。
Guava提供了HashBiMap和EnumBiMap两种常用的BiMap实现。
除了继承自Map接口的方法外,BiMap还添加了一些特有的方法:
以下示例,展示了如何使用 Guava 的 HashBiMap 实现 BiMap 接口,并演示了它的多种方法:
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import java.util.Set;
public class BiMapExample {
public static void main(String[] args) {
// 创建一个空的HashBiMap
BiMap<String, Integer> biMap = HashBiMap.create();
// 向BiMap中添加元素
biMap.put("One", 1);
biMap.put("Two", 2);
biMap.put("Three", 3);
// 使用get方法通过键获取值
System.out.println("Two maps to: " + biMap.get("Two")); // 输出: Two maps to: 2
// 使用get方法通过值获取键(使用inverse()方法)
System.out.println("2 maps to: " + biMap.inverse().get(2)); // 输出: 2 maps to: Two
// 检查BiMap中是否包含某个键
System.out.println("Does the map contain key 'One'? " + biMap.containsKey("One")); // 输出: Does the map contain key 'One'? true
// 检查BiMap中是否包含某个值
System.out.println("Does the map contain value 2? " + biMap.containsValue(2)); // 输出: Does the map contain value 2? true
// 获取BiMap的键集
Set<String> keys = biMap.keySet();
System.out.println("Keys in the map: " + keys); // 输出: Keys in the map: [One, Two, Three]
// 获取BiMap的值集
Set<Integer> values = biMap.values();
System.out.println("Values in the map: " + values); // 输出: Values in the map: [1, 2, 3]
// 获取BiMap的大小
int size = biMap.size();
System.out.println("Size of the map: " + size); // 输出: Size of the map: 3
// 尝试添加一个已存在的键(这将抛出IllegalArgumentException)
try {
biMap.put("One", 4);
} catch (IllegalArgumentException e) {
System.out.println("Caught exception: " + e.getMessage()); // 输出: Caught exception: value already present: One
}
// 尝试添加一个已存在的值(这也将抛出IllegalArgumentException)
try {
biMap.put("Four", 1);
} catch (IllegalArgumentException e) {
System.out.println("Caught exception: " + e.getMessage()); // 输出: Caught exception: value already present: 1
}
// 使用forcePut方法替换现有键的值(不推荐,因为这会破坏BiMap的双向性)
// 注意:通常不建议使用forcePut,因为它可能会使BiMap处于不一致的状态
// biMap.forcePut("One", 4); // 这行代码被注释掉了,因为不推荐使用
// 从BiMap中移除一个键值对
Integer removedValue = biMap.remove("Two");
System.out.println("Removed value for key 'Two': " + removedValue); // 输出: Removed value for key 'Two': 2
// 清除整个BiMap
biMap.clear();
System.out.println("Is the map empty after clearing? " + biMap.isEmpty()); // 输出: Is the map empty after clearing? true
}
}
注意:在这个例子中,没有使用 forcePut 方法,因为它会破坏 BiMap 的双向一致性。在实际开发中,你应该避免使用 forcePut 除非你非常清楚你在做什么,并且愿意接受可能带来的后果。
此外,由于 BiMap 保证键和值的唯一性,任何尝试插入重复键或值的操作都会抛出 IllegalArgumentException。这个特性使得 BiMap 特别适用于需要确保键值对唯一性的场景。
BiMap是Guava库中一个非常有用的数据结构,它提供了双向映射的能力,同时保证了键和值的唯一性。在处理需要双向查找的场景时,使用BiMap可以简化代码并提高性能。HashBiMap和EnumBiMap是两种常见的实现,它们分别适用于不同的用例。通过inverse方法,我们可以轻松地获取反向视图,而不需要手动创建另一个映射。forcePut方法提供了一种在添加重复键或值时抛出异常的方式,这有助于在开发过程中及早发现问题。
术因分享而日新,每获新知,喜溢心扉。 诚邀关注公众号 『
码到三十五
』 ,获取更多技术资料。