Java中IdentityHashMap、WeakHashMap和EnumMap的区别

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);
    }
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/26794.html
点赞
0.00 平均评分 (0% 分数) - 0