【Java必修课】HashMap性能很好?问过我EnumMap没
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两个参数,