/** * API文档描述 * To implement an unmodifiable map, the programmer needs only * to extend this class and provide an implementation for the entrySet method, * which returns a set-view of the map's mappings. Typically, * the returned set will, in turn, be implemented atop AbstractSet. * This set should not support the add or remove methods, and its iterator * should not support the remove method. *(为了实现一个不可修改的Map,需扩展该类并实现entrySet方法,返回的集合不支持add或remove方法,它的迭代器不应该支持remove方法。) * * To implement a modifiable map, the programmer must additionally override * this class's put method (which otherwise throws an * UnsupportedOperationException), and the iterator returned by entrySet().iterator() * must additionally implement its remove method. *(为了实现一个可修改的Map,需重写该类put方法,且entrySet().iterator()方法的迭代器必须另外实现它的remove方法。) */ publicabstractclassAbstractMap<K,V> implementsMap<K,V> { //keySet,values都是volatile的,保证了内存可见性。(1. 当写入主存时,使其值无效;2. 防止内存重排序) transientvolatile Set<K> keySet; transientvolatile Collection<V> values; //An Entry maintaining a key and a value. 维持一个value可变的key-value键值对 publicstaticclassSimpleEntry<K,V> implementsEntry<K,V>, java.io.Serializable{ privatefinal K key; private V value; } //An Entry maintaining an immutable key and value 维持一个不可变的key-value键值对 publicstaticclassSimpleImmutableEntry<K,V> implementsEntry<K,V>, java.io.Serializable{ privatefinal K key; privatefinal V value; } }
/** * An object that maps keys to values. A map cannot contain duplicate keys; * each key can map to at most one value. (Map集合中不能保持重复的key) */ publicinterfaceMap<K,V> { intsize(); booleanisEmpty(); booleancontainsKey(Object key); booleancontainsValue(Object value); V get(Object key); V put(K key, V value); V remove(Object key); voidputAll(Map<? extends K, ? extends V> m); voidclear(); Set<K> keySet(); Collection<V> values(); Set<Entry<K, V>> entrySet(); booleanequals(Object o); inthashCode(); //1.8版本新增方法 default V getOrDefault(Object key, V defaultValue){ V v; //如果key存在,在返回key对应的value值;否则返回默认值 return (((v = get(key)) != null) || containsKey(key)) ? v : defaultValue; } default V putIfAbsent(K key, V value){ V v = get(key); if (v == null) { v = put(key, value); }
publicbooleancontainsValue(Object value){ //通过entrySet()方法,获取内部元素的迭代器 Iterator<Entry<K,V>> i = entrySet().iterator();
//由于Map集合的value允许储存null值,因此,在查找指定value是否存在时,需要分两种情况 if (value==null) { while (i.hasNext()) { Entry<K,V> e = i.next(); if (e.getValue()==null) returntrue; } } else { while (i.hasNext()) { Entry<K,V> e = i.next(); if (value.equals(e.getValue())) returntrue; } } returnfalse; }
publicbooleancontainsKey(Object key){ Iterator<Entry<K,V>> i = entrySet().iterator();
//由于Map集合的key允许储存null值,因此,在查找指定key是否存在时,需要分两种情况 if (key==null) { while (i.hasNext()) { Entry<K,V> e = i.next(); if (e.getKey()==null) returntrue; } } else { while (i.hasNext()) { Entry<K,V> e = i.next(); if (key.equals(e.getKey())) returntrue; } } returnfalse; }
public V get(Object key){ //通过entrySet()方法,获取内部元素的迭代器 Iterator<Entry<K,V>> i = entrySet().iterator();
//由于Map集合的key-value允许存储null值,所以分两种情况查找
//遍历,然后找到与key所在的Entry对应的value 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(); } } returnnull; }
/** * This implementation returns a set that subclasses AbstractSet. * The subclass's iterator method returns a "wrapper object" over this map's entrySet() iterator. The size * method delegates to this map's size method and the contains method delegates to this map's containsKey method. */ public Set<K> keySet(){ //在该方法首次调用的时候,会创建keySet if (keySet == null) { keySet = new AbstractSet<K>() {
//返回了该map的entrySet()对象的迭代器的包装类 public Iterator<K> iterator(){ returnnew Iterator<K>() {
//获取entrySet()的迭代器 private Iterator<Entry<K,V>> i = entrySet().iterator();
public Collection<V> values(){ //实现逻辑同keySet()方法一致 if (values == null) { values = new AbstractCollection<V>() { public Iterator<V> iterator(){ returnnew Iterator<V>() { private Iterator<Entry<K,V>> i = entrySet().iterator();