Java - IdentityHashMap类

引言

你好,未来的Java开发者!今天,我们将开始一段激动人心的旅程,深入了解Java的IdentityHashMap类。我知道你可能会想:“又一个映射类?我们不是刚刚学习了HashMap吗?”你说得对,但相信我,IdentityHashMap有它自己独特的风味,使它变得特别。让我们深入了解一下吧!

Java - The IdentityHashMap Class

类声明

首先,让我们看看如何声明一个IdentityHashMap:

import java.util.IdentityHashMap;

IdentityHashMap<String, Integer> myMap = new IdentityHashMap<>();

这行代码创建了一个新的IdentityHashMap,用于存储String键和Integer值。但它与常规的HashMap有什么不同呢?好吧,这就是事情变得有趣的地方!

类构造函数

IdentityHashMap提供了四个构造函数。我们来逐一了解:

  1. 默认构造函数:

    IdentityHashMap<String, Integer> map1 = new IdentityHashMap<>();

    这将创建一个默认容量为21的空IdentityHashMap。

  2. 带有初始容量的构造函数:

    IdentityHashMap<String, Integer> map2 = new IdentityHashMap<>(100);

    这将创建一个具有指定初始容量的空IdentityHashMap。

  3. 带有另一个Map的构造函数:

    Map<String, Integer> existingMap = new HashMap<>();
    IdentityHashMap<String, Integer> map3 = new IdentityHashMap<>(existingMap);

    这将创建一个与指定Map具有相同映射的IdentityHashMap。

  4. 带有预期最大大小的构造函数:

    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