HashMap的继承结构
Java中,我们最常用的map类型可能就是HashMap
了,这一次介绍的重点也在HashMap上面。但是,在我们详细分析HashMap之前,我们先来看一下HashMap的继承结构:
Java中的Map接口
从上面的继承结构中,可以看出,Java中的HashMap是接口Map
的一个实现类,因此,在我们分析HashMap之前,不妨先来看看Map接口。
首先,我们来看一下Map中定义的方法:
可以看到,我们常用的方法,如get、set、size、isEmpty、remove、keySet、entrySet等,在map接口中都有定义,因此我们无论使用map接口的哪个具体实现类,都可以使用这个方法。
同时,注意到Map接口中还有着一个内部类的接口Entry
,那么我们再来看看这个内部类的接口中定义了哪些方法吧
从Entry的接口方法中可以看到,我们对于Entry的常用的方法,在这里也都有定义。
AbstractMap类
除了实现了Map
的接口外,Java中的Map的具体类多数还继承了一个叫做AbstractMap
的抽象类,这个抽象类是Java中为了实现Map所写的一个便利类,其中已经实现了很多Map所需的方法,也就是说如果我们需要其它的一个具体类,只需要完成抽象类AbstractMap
中所没有实现的方法即可(当然,也可以重写已实现的方法来实现具体的功能)。
我们先来看一下AbstractMap
中实现的方法:
这些方法都是已经有具体实现的方法,这里把其中一些常见的方法的实现贴出来:
public abstract class AbstractMap<K,V> implements Map<K,V> {
transient Set<K> keySet;
transient Collection<V> values;
protected AbstractMap() {
}
public int size() {
return entrySet().size();
}
public boolean isEmpty() {
return size() == 0;
}
以上几个方法的实现都比较简单,需要注意的是,entrySet()
方法在这个抽象类中并没有实现。
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;
}
public boolean containsKey(Object key) {
Iterator<Map.Entry<K,V>> i = entrySet().iterator();
if (key==null) {
while (i.hasNext()) {
Entry<K,V> e = i.next();
if (e.getKey()==null)
return true;
}
} else {
while (i.hasNext()) {
Entry<K,V> e = i.next();
if (key