◆ 视图:类比数据库的视图概念。将集合类对象中的数据重新映射到一个数据集合中,但这个集合不是一个物理上存在的对象实体,而是对原集合类对象的再映射,数据物理地址未变,只是访问数据的接口变了。
◆ 适配器:适配器是指这样一个对象:它把功能委托给一个后备对象,从而为后备对象提供一个可以替代的接口。
例:Map接口的keySet方法返回该Map对象的Set视图,该视图包含该Map中所有的key。HashMap的keyset()方法返回了key的Set类型视图,其中采用了适配器模式,部分源码如下:
public Set<K> keySet() {
Set<K> ks = keySet;
if (ks == null) {
ks = new KeySet();
keySet = ks;
}
return ks;
}
final class KeySet extends AbstractSet<K> {
public final int size() { return size; }
public final void clear() { HashMap.this.clear(); }
public final Iterator<K> iterator() { return new KeyIterator(); }
public final boolean contains(Object o) { return containsKey(o); }
public final boolean remove(Object key) {
return removeNode(hash(key), key, null, false, true) != null;
}
public final Spliterator<K> spliterator() {
return new KeySpliterator<>(HashMap.this, 0, -1, 0, 0);
}
public final void forEach(Consumer<? super K> action) {
Node<K,V>[] tab;
if (action == null)
throw new NullPointerException();
if (size > 0 && (tab = table) != null) {
int mc = modCount;
for (int i = 0; i < tab.length; ++i) {
for (Node<K,V> e = tab[i]; e != null; e = e.next)
action.accept(e.key);
}
if (modCount != mc)
throw new ConcurrentModificationException();
}
}
}
网友评论