一
Map接口的抽象实现,只有一个抽象的方法:entrySet()
其他的方法都可以基于这个方法返回的Set<Entry<K,V>>来实现,比如:
public int size() {
return entrySet().size();
}
和
public boolean containsValue(Object value) {
Iterator<Entry<K, V>> i = entrySet().iterator();
if (value == null) {
while (i.hasNext()) {
Entry<K, V> e = i.next();
if (e.getValue() == null)
return true;
}
} else {
while (i.hasNext()) {
Entry<K, V> e = i.next();
if (value.equals(e.getValue()))
return true;
}
}
return false;
}
二:
put(K,V)默认是不支持的
public V put(K key, V value) {
throw new UnsupportedOperationException();
}
remove()的方法是基于entrySet().iterator()返回的迭代器的
public V remove(Object key) {
Iterator<Entry<K, V>> i = entrySet().iterator();
Entry<K, V> correctEntry = null;
if (key == null) {
while (correctEntry == null && i.hasNext()) {
Entry<K, V> e = i.next();
if (e.getKey() == null)
correctEntry = e;
}
} else {
while (correctEntry == null && i.hasNext()) {
Entry<K, V> e = i.next();
if (key.equals(e.getKey()))
correctEntry = e;
}
}
V oldValue = null;
if (correctEntry != null) {
oldValue = correctEntry.getValue();
i.remove();
}
return oldValue;
}
三:
如果想要实现一个不可以修改的Map,只需要实现抽象方法entrySet()即可;
如果想要实现一个可变的Map,还需要实现put()方法和entrySet().iterator()返回的迭代器的remove()方法