Java - IdentityHashMap类
引言
你好,未来的Java开发者!今天,我们将开始一段激动人心的旅程,深入了解Java的IdentityHashMap类。我知道你可能会想:“又一个映射类?我们不是刚刚学习了HashMap吗?”你说得对,但相信我,IdentityHashMap有它自己独特的风味,使它变得特别。让我们深入了解一下吧!
类声明
首先,让我们看看如何声明一个IdentityHashMap:
import java.util.IdentityHashMap;
IdentityHashMap<String, Integer> myMap = new IdentityHashMap<>();
这行代码创建了一个新的IdentityHashMap,用于存储String键和Integer值。但它与常规的HashMap有什么不同呢?好吧,这就是事情变得有趣的地方!
类构造函数
IdentityHashMap提供了四个构造函数。我们来逐一了解:
-
默认构造函数:
IdentityHashMap<String, Integer> map1 = new IdentityHashMap<>();
这将创建一个默认容量为21的空IdentityHashMap。
-
带有初始容量的构造函数:
IdentityHashMap<String, Integer> map2 = new IdentityHashMap<>(100);
这将创建一个具有指定初始容量的空IdentityHashMap。
-
带有另一个Map的构造函数:
Map<String, Integer> existingMap = new HashMap<>(); IdentityHashMap<String, Integer> map3 = new IdentityHashMap<>(existingMap);
这将创建一个与指定Map具有相同映射的IdentityHashMap。
-
带有预期最大大小的构造函数:
IdentityHashMap<String, Integer> map4 = new IdentityHashMap<>(100, 0.75f);
这将创建一个具有指定预期最大大小和加载因子的空IdentityHashMap。
类方法
现在,让我们看看IdentityHashMap中一些最常用的方法:
方法 | 描述 |
---|---|
put(K key, V value) | 将指定的值与指定的键关联 |
get(Object key) | 返回指定键映射到的值 |
remove(Object key) | 如果存在,则移除该键的映射 |
clear() | 从此映射中移除所有映射 |
size() | 返回此映射中的键值映射数 |
isEmpty() | 如果此映射不包含键值映射,则返回true |
containsKey(Object key) | 如果此映射包含指定键的映射,则返回true |
containsValue(Object value) | 如果此映射将一个或多个键映射到指定值,则返回true |
让我们看看这些方法是如何运行的:
IdentityHashMap<String, Integer> ages = new IdentityHashMap<>();
// 添加键值对
ages.put("Alice", 25);
ages.put("Bob", 30);
// 获取一个值
System.out.println("Alice的年龄: " + ages.get("Alice")); // 输出:Alice的年龄: 25
// 检查一个键是否存在
System.out.println("Charlie存在吗? " + ages.containsKey("Charlie")); // 输出:Charlie存在吗? false
// 移除一个键值对
ages.remove("Bob");
// 检查大小
System.out.println("条目数: " + ages.size()); // 输出:条目数: 1
继承的方法
IdentityHashMap从其超类和接口继承了方法。以下是一些示例:
继承自 | 方法 |
---|---|
java.util.AbstractMap | clone(), equals(), hashCode(), toString() |
java.util.Map | entrySet(), keySet(), values() |
java.lang.Object | finalize(), getClass(), notify(), notifyAll(), wait() |
在IdentityHashMap中添加键值映射的示例
现在,让我们深入了解使IdentityHashMap特别的地方。与使用equals()方法比较键的HashMap不同,IdentityHashMap使用引用相等性(==)。这意味着只有当两个键是内存中完全相同的对象时,它们才被视为相等。
让我们看看这是如何工作的:
IdentityHashMap<String, String> identityMap = new IdentityHashMap<>();
String key1 = new String("Hello");
String key2 = new String("Hello");
identityMap.put(key1, "World1");
identityMap.put(key2, "World2");
System.out.println("IdentityHashMap的大小: " + identityMap.size());
System.out.println("key1的值: " + identityMap.get(key1));
System.out.println("key2的值: " + identityMap.get(key2));
输出:
IdentityHashMap的大小: 2
key1的值: World1
key2的值: World2
惊讶吗?尽管key1和key2具有相同的内容("Hello"),但IdentityHashMap将它们视为不同的键,因为它们是内存中不同的String对象。
这种行为在某些情况下可能非常有用。例如,假设你正在编写一个程序来跟踪文档的不同版本。每个版本可能具有相同的标题,但你希望将它们视为单独的实体。IdentityHashMap将是这种情况下的完美选择!
总之,IdentityHashMap就像是Map家族中的那个古怪表亲。它看起来与其他人相似,但有自己的独特做事方式。了解何时使用它可以使你成为一个更加多才多艺的Java程序员。
记住,在编程的世界里,没有一刀切的解决方案。每个工具都有它的用武之地,知道何时使用IdentityHashMap是你Java知识库中的另一支箭。继续练习,保持好奇心,祝编程愉快!
Credits: Image by storyset