public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements java.io.Serializable, Cloneable
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
我们可以看到EnumMap险些和HashMap是一样的,差异在于EnumMap的key是一个Enum。
下面看一个大略的利用的例子:
先定义一个Enum:
public enum Types { RED, GREEN, BLACK, YELLO}
再看下怎么利用EnumMap:
@Test public void useEnumMap(){ EnumMap<Types, String> activityMap = new EnumMap<>(Types.class); activityMap.put(Types.BLACK,"black"); activityMap.put(Types.GREEN,"green"); activityMap.put(Types.RED,"red"); }
其他的操作实在和hashMap是类似的,我们这里就不多讲了。
什么时候利用EnumMap由于在EnumMap中,所有的key的可能值在创建的时候已经知道了,以是利用EnumMap和hashMap比较,可以提升效率。
同时,由于key比较大略,以是EnumMap在实现中,也不须要像HashMap那样考虑一些繁芜的情形。
EnumSet跟EnumMap很类似,EnumSet是一个set,然后set中的元素都是某个Enum类型。
EnumSet是一个interface而不是一个类,要创建EnumSet类可以利用EnumSet供应的两个静态方法,noneOf和allOf。
先看一个noneOf:
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) { Enum<?>[] universe = getUniverse(elementType); if (universe == null) throw new ClassCastException(elementType + " not an enum"); if (universe.length <= 64) return new RegularEnumSet<>(elementType, universe); else return new JumboEnumSet<>(elementType, universe); }
noneOf传入一个Enum类,返回一个空的Enum类型的EnumSet。
从上面的代码我们可以看到EnumSet有两个实现,长度大于64的时候利用JumboEnumSet,小有64的时候利用RegularEnumSet。
把稳,JumboEnumSet和RegularEnumSet不建议直策应用,他是内部利用的类。
再看一下allOf:
public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) { EnumSet<E> result = noneOf(elementType); result.addAll(); return result; }
allOf很大略,先调用noneOf创建空的set,然后调用addAll方法将所有的元素添加进去。
总结EnumMap和EnumSet对特定的Enum工具做了优化,可以在得当的情形下利用。
欢迎关注我的"大众年夜众号:程序那些事,更多精彩等着您!
更多内容请访问 flydean.com