EnumMap
潍坊IT培训的老师说,EnumMap 是一个使用枚举值做 key 的 Map 实现.如下代码即可创建 EnumMap 的实例,创建时需要指定 key 类型的 class,或者传入一个 map 进行初始化.EnumMap 使用数组存储数据,效率高于 HashMap.
//创建一个具有指定键类型的空枚举映射EnumMap<SexThree,String> map1=new EnumMap<SexThree,String>(SexThree.class);//从一个 EnumMap 创建EnumMap<SexThree,String> map2 = new EnumMap<SexThree,String>(map1);//从一个 Map 创建Map<SexThree, ? extends String> map3 = new HashMap<>();EnumMap<SexThree,String> map4 = new EnumMap<SexThree, String>(map3);
EnumMap 使用枚举值做 key,因此选择了枚举值的下标作为值的下标,把值存储在一个数组中.这样显着提高了数据存取效率,但是容量不能发生变化,适合于数据量比较固定又需要较高效率的场景.
public V get(Object key) { return (isValidKey(key) ? unmaskNull(vals[((Enum<?>)key).ordinal()]) : null);}public V put(K key, V value) { typeCheck(key); int index = key.ordinal(); Object oldValue = vals[index]; vals[index] = maskNull(value); if (oldValue == null) size++; return unmaskNull(oldValue);}
EnumSet
EnumSet 是一个枚举集合,是一个抽象类,它有两个继承类:JumboEnumSet和 RegularEnumSet.EnumSet 使用 bit 位存储数据,效率高于 HashSet.
//创建一个包含指定元素类型的所有元素的枚举 setEnumSet<SexTwo> setAll = EnumSet.allOf(SexTwo.class);//创建一个指定范围的SetEnumSet<SexTwo> setRange = EnumSet.range(SexTwo.MALE,SexTwo.FEMALE);//创建一个指定枚举类型的空setEnumSet<SexTwo> setEmpty = EnumSet.noneOf(SexTwo.class);//复制一个setEnumSet<SexTwo> setNew = EnumSet.copyOf(setRange);
从 JumboEnumSet 的 add 方法可以一窥 EnumSet 的实现原理.首先把枚举值的下标值无符号右移 6 位,也就是按照 64 位进行分组,找到当前分组的数值.然后,按照枚举值的下标值进行左移,找到添加的位置,把该位置置为 1.同样地,EnumSet 的容量也不能发生变化,枚举类型的定义决定了 EnumSet 的固定容量值.
public boolean add(E e) { typeCheck(e); int eOrdinal = e.ordinal(); int eWordNum = eOrdinal >>> 6; long oldElements = elements[eWordNum]; elements[eWordNum] |= (1L << eOrdinal); boolean result = (elements[eWordNum] != oldElements); if (result) size++; return result;}
关于枚举就讨论到这里,欢迎留言讨论.
以上就是潍坊IT培训给大家做的内容详解,更多关于IT的学习,请继续关注潍坊IT培训