读EnumMap源码 博客分类: java集合 java
程序员文章站
2024-03-14 12:42:16
...
//一个key是枚举类型的map,速度基本会比hashMap更快 //先看构造函数 //构造指定键类型的EnumMap public EnumMap(Class<K> keyType) { this.keyType = keyType; //获取key的枚举值 keyUniverse = getKeyUniverse(keyType); vals = new Object[keyUniverse.length]; } public EnumMap(EnumMap<K, ? extends V> m) { keyType = m.keyType; keyUniverse = m.keyUniverse; vals = m.vals.clone(); size = m.size; } public EnumMap(Map<K, ? extends V> m) { if (m instanceof EnumMap) { EnumMap<K, ? extends V> em = (EnumMap<K, ? extends V>) m; keyType = em.keyType; keyUniverse = em.keyUniverse; vals = em.vals.clone(); size = em.size; } else { if (m.isEmpty()) throw new IllegalArgumentException("Specified map is empty"); //获取key的class类型 keyType = m.keySet().iterator().next().getDeclaringClass(); keyUniverse = getKeyUniverse(keyType); vals = new Object[keyUniverse.length]; putAll(m); } } //插入值 public V put(K key, V value) { //验证key的class类型 typeCheck(key); //获取枚举的位置 int index = key.ordinal(); Object oldValue = vals[index]; vals[index] = maskNull(value); if (oldValue == null) size++; return unmaskNull(oldValue); } //判断key的class类型 private void typeCheck(K key) { Class keyClass = key.getClass(); if (keyClass != keyType && keyClass.getSuperclass() != keyType) throw new ClassCastException(keyClass + " != " + keyType); } //通过key获取值 public V get(Object key) { return (isValidKey(key) ? unmaskNull(vals[((Enum)key).ordinal()]) : null); } //校验key private boolean isValidKey(Object key) { if (key == null) return false; // Cheaper than instanceof Enum followed by getDeclaringClass Class keyClass = key.getClass(); return keyClass == keyType || keyClass.getSuperclass() == keyType; } //根据key删除值 public V remove(Object key) { if (!isValidKey(key)) return null; int index = ((Enum)key).ordinal(); Object oldValue = vals[index]; vals[index] = null; if (oldValue != null) size--; return unmaskNull(oldValue); } //删除映射 private boolean removeMapping(Object key, Object value) { if (!isValidKey(key)) return false; int index = ((Enum)key).ordinal(); if (maskNull(value).equals(vals[index])) { vals[index] = null; size--; return true; } return false; } //返回集合长度 public int size() { return size; } //是否包含某个key public boolean containsKey(Object key) { return isValidKey(key) && vals[((Enum)key).ordinal()] != null; } //是否包含某个值 public boolean containsValue(Object value) { value = maskNull(value); for (Object val : vals) if (value.equals(val)) return true; return false; } //清空 public void clear() { Arrays.fill(vals, null); size = 0; } //添加所有的 public void putAll(Map<? extends K, ? extends V> m) { if (m instanceof EnumMap) { EnumMap<? extends K, ? extends V> em = (EnumMap<? extends K, ? extends V>)m; if (em.keyType != keyType) { if (em.isEmpty()) return; throw new ClassCastException(em.keyType + " != " + keyType); } for (int i = 0; i < keyUniverse.length; i++) { Object emValue = em.vals[i]; if (emValue != null) { if (vals[i] == null) size++; vals[i] = emValue; } } } else { super.putAll(m); } }
推荐阅读
-
读ExecutorCompletionService源码 博客分类: java多线程 java
-
读WeakHashMap源码 博客分类: java集合 java
-
读WeakHashMap源码 博客分类: java集合 java
-
读IdentityHashMap源码 博客分类: java集合 java
-
读ExecutorCompletionService源码 博客分类: java多线程 java
-
读EnumMap源码 博客分类: java集合 java
-
读EnumSet源码 博客分类: java集合 java
-
读Stack源码 博客分类: java集合 java
-
读ThreadLocal源代码 博客分类: java多线程 java
-
读Collections源码 博客分类: java集合 java