1 简介

我们知道Map只是一个接口,它有多种实现,Java中最常用的是HashMap了。而本文想讲述的是另一个实现:EnumMap。它是枚举类型的Map,要求它的Key值都必须是枚举型的。

2 创建你的EnumMap

既然是关于枚举类型的Map,我们先创建一个枚举,以便后续使用:

public enum Directions {     NORTH, SOUTH, EAST, WEST }

2.1 创建EnumMap的三种方法

JDK提供的创建EnumMap的方法有三种,代码如下:

//new EnumMap EnumMap<Direction, String> enumMap = new EnumMap<>(Direction.class); enumMap.put(Direction.EAST, "东"); enumMap.put(Direction.SOUTH, "南"); //从EnumMap复制 EnumMap<Direction, String> enumMapCopyEnumMap = new EnumMap<>(enumMap); assertEquals(enumMap, enumMapCopyEnumMap); //从Map复制 Map<Direction, String> hashMap = Maps.newHashMap(); hashMap.put(Direction.EAST, "东"); hashMap.put(Direction.SOUTH, "南"); EnumMap<Direction, String> enumMapCopyHashMap = new EnumMap<>(hashMap); assertEquals(enumMap, enumMapCopyHashMap);
  • (1) 使用new EnumMap()方法时,与HashMap不同,它必须传入一个枚举的类型才能创建对象;

  • (2) 从EnumMap复制,这时传入的参数为EnumMap

  • (3) 从Map复制,传入的参数为Map,但要求Key的类型必须是枚举型。

2.2 聪明的Guava

其实可以综合上面三种情况,实际就是两种方法:

  • (1) 使用new EnumMap(Class<K> keyType)

  • (2) 使用new EnumMap(Map<K, ? extends V> m)

聪明的Guava就只提供了这两种方法,如下:

//使用Guava创建 EnumMap<Direction, String> enumMapGuava = Maps.newEnumMap(Direction.class); enumMapGuava.put(Direction.SOUTH, "南"); assertEquals(1, enumMapGuava.size()); enumMapGuava = Maps.newEnumMap(enumMap); assertEquals(enumMap, enumMapGuava);

3 基本操作

提供的方法与Map当然是一样的,操作十分方便,代码如下:

@Test public void operations() {   EnumMap<Direction, String> map = Maps.newEnumMap(Direction.class);   //增加   map.put(Direction.EAST, "东");   map.put(Direction.SOUTH, "南");   map.put(Direction.WEST, "西");   //查询   assertTrue(map.containsKey(Direction.EAST));   assertFalse(map.containsKey(Direction.NORTH));   //删除   map.remove(Direction.EAST);   assertFalse(map.containsKey(Direction.EAST));   assertFalse(map.remove(Direction.WEST, "北"));   assertTrue(map.remove(Direction.WEST, "西"));   //清空   map.clear();   assertEquals(0, map.size()); }

需要特别指出的是删除方法,可以传入Key和Value两个参数,