IdentityHashMap、WeakHashMap和EnumMap都是Java集合框架中实现了Map接口的类。不过,它们之间存在着一些显著的区别。
IdentityHashMap实现了Map接口。在比较键(和值)时,它遵循引用相等性而不是对象相等性。当我们需要通过引用来比较对象时,这个类就非常有用。它不是同步的,必须在外部进行同步。此类中的迭代器是快速失败的,如果在迭代过程中尝试修改结构,会抛出ConcurrentModificationException。
#### IdentityHashMap的工作原理:
// Java程序演示IdentityHashMap的工作原理
import java.util.*;
public class IteratingIdentityHashMap {
public static void main(String[] args)
{
// 创建一个空的IdentityHashMap
IdentityHashMap ihmap
= new IdentityHashMap();
// 将字符串值映射到整数键
ihmap.put(10, "Geeks");
ihmap.put(20, "4");
ihmap.put(30, "Geeks");
ihmap.put(40, "Welcomes");
ihmap.put(50, "You");
// 显示IdentityHashMap的大小
System.out.println("IdentityHashMap size : "
+ ihmap.size());
// 显示IdentityHashMap的内容
System.out.println("Initial identity hash map: "
+ ihmap);
// 在IdentityHashMap上创建一个迭代器
Iterator<IdentityHashMap.Entry >
itr = ihmap.entrySet().iterator();
// hasNext()方法用于检查是否有下一个元素
// next()方法用于检索下一个元素
while (itr.hasNext())
{
IdentityHashMap.Entry entry = itr.next();
System.out.println("Key = " + entry.getKey()
+ ", Value = "
+ entry.getValue());
}
}
}
输出:
IdentityHashMap size : 5
Initial identity hash map: {10=Geeks, 40=Welcomes, 50=You, 30=Geeks, 20=4}
Key = 10, Value = Geeks
Key = 40, Value = Welcomes
Key = 50, Value = You
Key = 30, Value = Geeks
Key = 20, Value = 4
WeakHashMap是Map接口的一种实现,它只存储弱键。在WeakHashMap中,我们只能存储键的弱引用,这允许当键不再被通常使用时,键值对可以被垃圾回收。WeakHashMap是基于HashTable的实现的,但它不是同步的。它允许存储null键和null值。
#### WeakHashMap的工作原理:
// Java程序演示WeakHashMap
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
class WeakHashMapdemo {
public static void main(String[] arg)
{
Map whmap = new WeakHashMap();
whmap.put(1, "geeks");
whmap.put(2, "4");
whmap.put(3, "geeks");
whmap.put(4, "welcomes");
whmap.put(5, "you");
// 显示WeakHashMap
System.out.println("WeakHashMap is : " + whmap);
// 检查 "welcomes" 是否存在
if (whmap.containsValue("welcomes"))
System.out.println("Yes welcomes exist");
// 检查 3 是否作为键存在于map中
if (whmap.containsKey(3))
System.out.println("Yes 3 exist");
// 为键创建Set视图
Set keyset = whmap.keySet();
// 显示键集
System.out.println("key Set : " + keyset);
Collection values = whmap.values();
// 显示map的值
System.out.println("Values : " + values);
// 移除所有数据
whmap.clear();
// 检查map是否为空
if (whmap.isEmpty())
System.out.println("Empty WeakHashMap: " + whmap);
}
}
输出:
WeakHashMap is : {5=you, 4=welcomes, 3=geeks, 2=4, 1=geeks}
Yes welcomes exist
Yes 3 exist
key Set : [5, 4, 3, 2, 1]
Values : [you, welcomes, geeks, 4, geeks]
Empty WeakHashMap: {}
EnumMap是专门用于枚举类型的Map接口实现。它继承了AbstractMap并在Java中实现了Map接口。EnumMap的一些重要特性如下:
- EnumMap类是Java集合框架的成员,它不是同步的。
- EnumMap是一个有序集合,并且按照其键的自然顺序(键的自然顺序指的是枚举常量在枚举类型中声明的顺序)进行维护。
- EnumMap不允许插入null键,如果我们尝试插入null键,它将抛出NullPointerException。
- EnumMap在内部使用数组表示,因此它提供了更好的性能。
#### EnumMap的工作原理:
// Java程序演示EnumMap的工作原理
import java.util.*;
class EnumMapExample {
public enum Months {
January,
February,
March,
April;
}
public static void main(String[] args)
{
// 创建一个Months枚举类型的EnumMap
EnumMap enumMap = new EnumMap(Months.class);
// 使用put()方法插入
enumMap.put(Months.January, 31);
enumMap.put(Months.February, 28);
enumMap.put(Months.March, 31);
enumMap.put(Months.April, 30);
// 打印EnumMap的大小
System.out.println("Size of EnumMap: "
+ enumMap.size());
// 打印EnumMap的内容
System.out.println("EnumMap: " + enumMap);
}
}