一、类图
二、源码分析
a. AbstractMap 是 Map 的一个实现骨架,只留了一个抽象方法
public abstract Set<Entry<K,V>> entrySet();
b. 当实现为 unmodifiable map 时,只需实现 entrySet 方法;
当实现为 modifiable map 时,还需要重写 put 方法,默认 put 抛出 UnsupportedOperationException 异常
c. remove 方法是通过 Iterator remove 实现的
d. clear 借助 entrySet 的 clear 实现
e. keySet 、values 默认保存在 变量里
transient Set<K> keySet;
transient Collection<V> values;
keySet 方法,首先判断 keySet 变量是否已被初始化,有值就直接返回,否则先赋值再返回
返回的值其实是支持迭代的 AbstractSet 类型的对象
values 方法与 keySet 方法类似
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;
}
f. Map 的 Key 或 Value 依然可以是 Map
g. 内置了两种 Entry 实现 SimpleEntry and SimpleImmutableEntry
h. entry 的 hashcode 默认是 key 和 value 的 hashcode 异或的结果