HashMap


public class HashMap<K,V> extends AbstractMap<K,V>
  implements Map<K,V>, Cloneable, Serializable {   }

AbstractMap (抽象类)提供了 Map 接口的部分实现。

public abstract class AbstractMap<K,V> implements Map<K,V>
抽象类中可以有非抽象方法
抽象类可以不用实现接口的全部方法。抽象可以添加自己的抽象方法,让子类去实现。
有的时候需要将接口和抽象类配合起来使用,这样可以为开发者提供相当的便利性,开发者觉得哪个方便就选用哪个。这样的抽象类称为便利类。此时,便利类并不需要实现接口的所有方法,可以留给继承它的子类去实现它们。

AbstractMap 提供了 Map 的基本实现,我们以后要实现一个 Map 不用从头开始,只需要继承 AbstractMap, 然后按需求实现/重写对应方法即可。
AbstractMap 中唯一的一个抽象方法:

public abstract Set<Entry<K,V>> entrySet();

当我们要实现一个 不可变的 Map 时,只需要继承这个类,然后实现 entrySet() 方法,这个方法返回一个保存所有 key-value 映射的 set。 通常这个 Set 不支持 add(), remove() 方法,Set 对应的迭代器也不支持 remove() 方法。
如果想要实现一个 可变的 Map,我们需要在上述操作外,重写 put() 方法,因为 默认不支持 put 操作:Map 中

public V put(K key, V value) {
    throw new UnsupportedOperationException();
}


AbstractMap 成员变量

transient volatile Set<K>        keySet;
transient volatile Collection<V> values;

他们都是 transient,volatile,分别表示不可序列化、并发环境下变量的修改能够保证线程可见性。
需要注意的是 volatile 只能保证可见性,不能保证原子性,需要保证操作是原子性操作,才能保证使用 volatile 关键字的程序在并发时能够正确执行。

HashMap:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

  等效于:1X 2^4 ,初始化容量。

static final int MAXIMUM_CAPACITY = 1 << 30;

  最大容量:2^30

 static final int MIN_TREEIFY_CAPACITY = 64;

  最小容量:64

posted @ 2019-04-09 18:03  payn  阅读(148)  评论(0)    收藏  举报