java.util.AbstractMap
()
构造方法/** * 惟一的构造器。(通常由子类隐式调用) */ protexted AbstractMap(){ }
size()
返回当前map的大小public int size() { return entrySet().size(); }
这里的
entrySet()
返回一个Set<Entry<K,V>>
对象。可是当前类AbstractMap
没有实现它。下同java
isEmpty()
判断当前Map是否为空public boolean isEmpty() { return size() == 0; }
containsKey(Object key)
是否包含指定keypublic boolean containsKey(Object key) { Iterator<Map.Entry<K,V>> i = entrySet().iterator(); if (key==null) { while (i.hasNext()) { Entry<K,V> e = i.next(); if (e.getKey()==null) return true; } } else { while (i.hasNext()) { Entry<K,V> e = i.next(); if (key.equals(e.getKey())) return true; } } return false; }
一样依靠
entrySet()
方法,使用迭代器检查每个Entry
的Key值
当参数key为空时,有任何一个Entry的key值为空则返回true
当参数key不为空时,参数key的equals
方法与任何一个key返回true时本方法返回true
其余状况返回false缓存
get(Object key)
获取指定valpublic V get(Object key) { Iterator<Entry<K,V>> i = entrySet().iterator(); if (key==null) { while (i.hasNext()) { Entry<K,V> e = i.next(); if (e.getKey()==null) return e.getValue(); } } else { while (i.hasNext()) { Entry<K,V> e = i.next(); if (key.equals(e.getKey())) return e.getValue(); } } return null; }
与
containsKey(Object key)
相同,返回值由bool变成了Entry
的getVale
的返回值
其余状况下,返回null
并发
public V put(K key, V value) { throw new UnsupportedOperationException(); }
直接抛出异常UnsupportedOperationExceptionthis
remove(Object key)
删除指定键值public V remove(Object key) { Iterator<Entry<K,V>> i = entrySet().iterator(); Entry<K,V> correctEntry = null; if (key==null) { while (correctEntry==null && i.hasNext()) { Entry<K,V> e = i.next(); if (e.getKey()==null) correctEntry = e; } } else { while (correctEntry==null && i.hasNext()) { Entry<K,V> e = i.next(); if (key.equals(e.getKey())) correctEntry = e; } } V oldValue = null; if (correctEntry !=null) { oldValue = correctEntry.getValue(); i.remove(); } return oldValue; }
基于
entrySet()
,获取到对应Entry
后,缓存其val,并在迭代器中删除找到的Entry
,而后返回valcode
putAll(Map<? extends K, ? extends V> m)
添加指定Map中的键值对到当前当前Map中public void putAll(Map<? extends K, ? extends V> m) { for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) put(e.getKey(), e.getValue()); }
基于
entrySet()
,迭代调用put(K key, V value)
方法进行操做
本类中put(K key, V value)
的实现为直接抛出UnsupportedOperationException()
异常对象
public void clear() { entrySet().clear(); }
直接清空
entrySet()
所返回的Set
集合rem
keySet
与values
transient Set<K> keySet; transient Collection<V> values;
这两个变量主要用于
keySet()
与values()
方法。get
Set<K> keySet()
获取key
集合public Set<K> keySet() { Set<K> ks = keySet; if (ks == null) { ks = new AbstractSet<K>() { public Iterator<K> iterator() { return new Iterator<K>() { private Iterator<Entry<K,V>> i = entrySet().iterator(); public boolean hasNext() { return i.hasNext(); } public K next() { return i.next().getKey(); } public void remove() { i.remove(); } }; } public int size() { return AbstractMap.this.size(); } public boolean isEmpty() { return AbstractMap.this.isEmpty(); } public void clear() { AbstractMap.this.clear(); } public boolean contains(Object k) { return AbstractMap.this.containsKey(k); } }; keySet = ks; } return ks; }
此方法会初始化成员变量
keySet
并保持它的单例(由于没有作同步处理,因此有可能在并发环境下返回不一样的对象)。
此方法构造的Set
集合实际类型为AbstractSet
的匿名内部类,主要有以下实现同步
iterator()
方法的实现每次构造一个新的Iterator
对象,并在内部保存外部类的entrySet()
的iterator()
方法所返回的迭代器对象。做为委派目标i
- 新的Iterator对象的
hasNext()
,next()
,remove()
方法均委托到变量i
AbstractSet
其余的实现方法size()
,isEmpty()
,clear()
,contains(Object k)
所有委托到外部类AbstractMap
的同名方法这里发生了一次数据上的可能的分离,就是
iterator()
所返回对象内部对象i
来自entrySet().iterator()
,而此时其余的方法如size()
使用的实际方法为entrySet().size()
,有可能会发生数据不一样步的状况hash
public Collection<V> values() { Collection<V> vals = values; if (vals == null) { vals = new AbstractCollection<V>() { public Iterator<V> iterator() { return new Iterator<V>() { private Iterator<Entry<K,V>> i = entrySet().iterator(); public boolean hasNext() { return i.hasNext(); } public V next() { return i.next().getValue(); } public void remove() { i.remove(); } }; } public int size() { return AbstractMap.this.size(); } public boolean isEmpty() { return AbstractMap.this.isEmpty(); } public void clear() { AbstractMap.this.clear(); } public boolean contains(Object v) { return AbstractMap.this.containsValue(v); } }; values = vals; } return vals; }
与
keySet()
相同,只是返回类型换为容许重复元素的AbstractCollection
equals(Object o)
比较两个Map
是否相同public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Map)) return false; Map<?,?> m = (Map<?,?>) o; if (m.size() != size()) return false; try { Iterator<Entry<K,V>> i = entrySet().iterator(); while (i.hasNext()) { Entry<K,V> e = i.next(); K key = e.getKey(); V value = e.getValue(); if (value == null) { if (!(m.get(key)==null && m.containsKey(key))) return false; } else { if (!value.equals(m.get(key))) return false; } } } catch (ClassCastException unused) { return false; } catch (NullPointerException unused) { return false; } return true; }
比较流程以下
- 若是是同一个对象,则返回
true
- 若是入参不是
Map
的子类,直接返回false
- 若是二者的
size()
返回的数量不一样,直接返回false
- 使用
entrySet().iterator()
获取当前对象的迭代器并进行迭代。进行以下操做- 迭代中。当val为空时,使用key向入参map进行值获取,结果值不为空或不包含这个key时,返回
false
- 迭代中。当val为不空时,使用key向入参map进行值获取,当使用
equals
比较二者不相同时,返回false
- 迭代中出现
ClassCastException
与NullPointerException
返回false
- 执行到结尾,返回
true
hashCode()
获取HashCodepublic int hashCode() { int h = 0; Iterator<Entry<K,V>> i = entrySet().iterator(); while (i.hasNext()) h += i.next().hashCode(); return h; }
迭代全部
Entry
,累加全部Entry
的HashCode
clone()
clone当前对象protected Object clone() throws CloneNotSupportedException { AbstractMap<?,?> result = (AbstractMap<?,?>)super.clone(); result.keySet = null; result.values = null; return result; }
注意,这里是浅拷贝,并对新对象的
keySet
与values
属性进行置空
因为当前抽象类的绝大多数实现是基于方法entrySet()
方法,因此这个方法须要由实现类进行关注。防止浅拷贝后,新对象指向老引用引起问题