Java EnumMap使用教程

x33g5p2x  于2021-08-20 转载在 Java  
字(4.6k)|赞(0)|评价(0)|浏览(570)

在这篇文章中,我们将了解Java中EnumMap的全部内容。什么是EnumMap,如何用例子来使用它?

我们将学到什么?

  1. EnumMap类概述
  2. EnumMapClass构造函数总结
  3. EnumMapClass方法总结
  4. EnumMap类实例

1. EnumMap类概述

像大多数集合的实现一样,EnumMap是不同步的。如果多个线程同时访问一个枚举图,并且至少有一个线程修改了该枚举图,那么它应该在外部进行同步。 

例子。

Map<EnumKey, V> m
         = Collections.synchronizedMap(new EnumMap<EnumKey, V>(...));

EnumMap类的属性

  1. EnumMap中使用的所有键都必须来自在Java中创建EnumMap时指定的同一Enum类型。例如,如果你不能使用来自两个不同枚举的不同枚举实例。
  2. EnumMap是一个有序的集合,它们按照其键的自然顺序进行维护(键的自然顺序是指在枚举类型中声明枚举常数的顺序)。你可以在Java中遍历EnumMap时验证这一点。
  3. 1.EnumMap的迭代器是快速失败的迭代器,就像ConcurrentHashMap一样,不会抛出ConcurrentModificationException,在迭代过程中可能不会显示对EnumMap的任何修改的影响。
  4. 在Java中不能在EnumMap中插入空键。EnumMap不允许空键并抛出NullPointerException,同时也允许空值。
  5. EnumMap是不同步的,在并发或多线程环境中使用前必须手动同步。就像同步Map一样,在Java中,你也可以通过使用Collections.synchronizedMap()方法使EnumMap同步,根据Javadoc,在java中创建EnumMap时应该这样做以避免意外的非同步访问。
  6. 1.EnumMap可能比Java中的HashMap有更好的性能。因此,如果你要使用枚举键,最好选择EnumMap。

2. EnumMap类构造函数摘要

  • EnumMap(Class keyType) - 用指定的键类型创建一个空的枚举Map。
  • EnumMap(EnumMap<K,?extends V> m) - 创建一个与指定枚举Map具有相同键类型的枚举Map,最初包含相同的映射(如果有)。
  • EnumMap(Map<K,? extends V> m) - 创建一个由指定Map初始化的枚举Map。

3. EnumMap类方法总结

  • void clear()- 移除该Map中的所有映射。
  • EnumMap<K,V> clone() - 返回这个枚举图的一个浅层拷贝。
  • boolean containsKey(Object key)- 如果这个Map包含一个指定键的映射,则返回true。
  • boolean containsValue(Object value)- 如果这个Map将一个或多个键映射到指定的值,则返回true。
  • Set<Map.Entry<K,V>> entrySet()- 返回此Map中包含的映射的Set视图。
  • boolean equals(Object o)- 将指定的对象与这个Map进行比较,以确定是否相等。
  • V get(Object key)- 返回指定键所映射的值,如果这个Map不包含键的映射,则返回空值。
  • int hashCode() - 返回这个Map的哈希代码值。
  • Set keySet()- 返回该Map中包含的键的Set视图。
  • V put(K key, V value) - 将指定的值与该Map中指定的键关联起来。
  • void putAll(Map<?extends K,?extends V> m)- 把所有的映射从指定的Map复制到这个Map。
  • V remove(Object key)- 如果存在的话,从这个Map中删除这个键的映射。
  • int size() - 返回这个Map中键值映射的数量。
  • Collection values()- 返回这个Map中包含的数值的集合视图。

4. EnumMap类示例

简单的Days Enum例子

在这个例子中, 我们将使用Days枚举, 把所有预定义的日子作为EnumMap的键。

import java.util.EnumMap;
import java.util.Map.Entry;

//*/*
/* EnumMap Demonstration Example
/* @author Ramesh Fadatare
/*
/*/
public class EnumMapExample {
     enum Days {
         SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
     }

     public static void main(final String[] args) {
         final EnumMap<Days, String> enumMap = new EnumMap<>(Days.class);
         enumMap.put(Days.SUNDAY, "Its Sunday!!");
         enumMap.put(Days.MONDAY, "Its Monday!!");
         enumMap.put(Days.TUESDAY, "Its Tuesday!!");
         enumMap.put(Days.WEDNESDAY, "Its Wednesday!!");
         enumMap.put(Days.THURSDAY, "Its Thursday!!");
         enumMap.put(Days.FRIDAY, "Its Friday!!");
         enumMap.put(Days.SATURDAY, "Its Saturday!!");
  
         for(final Entry<Days, String> entry : enumMap.entrySet()){
             System.out.println(" Key -> " + entry.getKey().SUNDAY);
             System.out.println("Value - >" + entry.getValue());
         }
     }
}

输出:

Key -> SUNDAY
Value - >Its Sunday!!
 Key -> SUNDAY
Value - >Its Monday!!
 Key -> SUNDAY
Value - >Its Tuesday!!
 Key -> SUNDAY
Value - >Its Wednesday!!
 Key -> SUNDAY
Value - >Its Thursday!!
 Key -> SUNDAY
Value - >Its Friday!!
 Key -> SUNDAY
Value - >Its Saturday!!

现实世界的例子

我们知道,每个项目都有一个列表状态,如一个项目是活动的、非活动的、关闭的、开始的等等。让我们创建一个ProjectStatus Enum,作为每个项目的关键。让我们用一个例子来证明这一点。

import java.util.EnumMap;
import java.util.Map.Entry;

//*/*
/* EnumMap Demonstration Example
/* @author Ramesh Fadatare
/*
/*/
public class EnumMapExample2 {
    public static void main(final String[] args) {
        final EnumMap<ProjectStatus, Project> enumMap = new EnumMap<>(ProjectStatus.class);
        enumMap.put(ProjectStatus.ACTIVE, new Project(100, "Customer Management System", "Customer Management System"));
        enumMap.put(ProjectStatus.INACTIVE,
        new Project(200, "Employee Management System", "Employee Management System"));

        for (final Entry<ProjectStatus, Project> entry : enumMap.entrySet()) {
            final ProjectStatus projectStatus = entry.getKey();
            System.out.println(" Key -> " + projectStatus.name());
            final Project project = entry.getValue();
            System.out.println("Value - >" + project.toString());
       }
 }

   enum ProjectStatus {
      ACTIVE, INACTIVE
   }
}

class Project {
    private int id;
    private String name;
    private String desc;

    public Project(final int id, final String name, final String desc) {
        super();
        this.id = id;
        this.name = name;
        this.desc = desc;
    }

    public int getId() {
        return id;
    }

    public void setId(final int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public String getDesc() {
       return desc;
    }

    public void setDesc(final String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "[project id : " + this.id + ", project name : "
                + this.name + ", project desc : " + this.desc + " ]";
    }
}

输出:

Key -> ACTIVE
Value - >[project id : 100, project name : Customer Management System, project desc : Customer Management System ]
 Key -> INACTIVE
Value - >[project id : 200, project name : Employee Management System, project desc : Employee Management System ]

###参考
https://docs.oracle.com/javase/8/docs/api/java/util/EnumMap.html

相关文章