📜  JavaIdentityHashMap、WeakHashMap、EnumMap的区别(1)

📅  最后修改于: 2023-12-03 14:42:23.167000             🧑  作者: Mango

JavaIdentityHashMap、WeakHashMap、EnumMap的区别

在Java中,我们有许多Map实现类可供我们使用。本文将介绍JavaIdentityHashMap、WeakHashMap和EnumMap三种Map实现类的区别。

JavaIdentityHashMap

JavaIdentityHashMap是Java的一个Map实现类,它与HashMap和Hashtable等类似,不同之处在于它使用“引用相等”而不是“值相等”来比较键和值。当且仅当两个键引用同一个对象时,JavaIdentityHashMap才认为它们是相等的。这意味着如果两个键在内容上相同,但是它们不是同一个对象的引用,那么JavaIdentityHashMap将认为它们是不同的键。

Map<String, Integer> map = new JavaIdentityHashMap<>();
String key1 = new String("key");
String key2 = new String("key");
map.put(key1, 1);
map.put(key2, 2);
System.out.println(map.get(key1)); // 1
System.out.println(map.get(key2)); // 2

上面的例子中,尽管key1和key2在内容上相同,但它们不是同一个对象的引用,所以JavaIdentityHashMap认为它们是不同的键。

WeakHashMap

WeakHashMap是Java的一个Map实现类,它使用弱引用来保存键。因此,当键对象没有被任何其他对象引用时,它可以被垃圾回收器回收,并且在下一次尝试访问该键对象时,WeakHashMap会自动将其删除。这使得WeakHashMap非常适合用于缓存或者存储临时对象。

Map<String, Object> map = new WeakHashMap<>();
Object key = new Object();
map.put(key, "value");
System.out.println(map.get(key)); // value
key = null;
System.gc();
Thread.sleep(1000);
System.out.println(map.get(key)); // null

上面的例子中,当我们将key对象置为null并强制进行垃圾回收时,这个键-值对就不再存在于WeakHashMap中。

EnumMap

EnumMap是Java的一个Map实现类,它是专门用于枚举类型的Map。EnumMap是一种高效、紧凑的实现方式,它比普通的HashMap或TreeMap在性能上要更好。

enum Color {
    RED,
    BLUE,
    GREEN
}

Map<Color, Integer> map = new EnumMap<>(Color.class);
map.put(Color.RED, 1);
map.put(Color.BLUE, 2);
map.put(Color.GREEN, 3);
System.out.println(map.get(Color.RED)); // 1
System.out.println(map.get(Color.BLUE)); // 2
System.out.println(map.get(Color.GREEN)); // 3

上面的例子中,我们创建了一个EnumMap,它的键类型是Color枚举类型。我们可以像使用普通Map一样使用EnumMap。

总结

JavaIdentityHashMap、WeakHashMap和EnumMap是Java中的三种不同的Map实现类,它们分别使用“引用相等”、“弱引用”和“枚举类型”作为键的比较方式。在选择使用这些Map实现类时,我们需要根据实际的业务场景和需求进行选择。