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

浙公网安备 33010602011771号