Java中的AbstractMap是个抽象类,提供了一个Map接口的基础实现。
其keySet()方法是返回map中所有的key的集合。
看了其源码,一头雾水。想知道它是怎么实现的?
源码如下:
transient volatile Set<K> keySet = null;
transient volatile Collection<V> values = null;
public Set<K> keySet() {
if (keySet == null) {
keySet = 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);
}
};
}
return keySet;
}
PHPz2017-04-18 09:49:34
public Set<K> keySet() {
if (keySet == null) {
// 创建一个 Set 实例因为 AbstractSet 是一个抽象类,所以需要实现抽象方法,并且Java编译的时候会生成一个匿名类
keySet = new AbstractSet<K>() {
// iterator 接口在 java 中for each 会调用该方法
public Iterator<K> iterator() {
// 创建 Iterator 实例因为 Iterator 是一个接口同时这里也会生成一个匿名类
return new Iterator<K>() {
// entrySet() 是 AbstractMap 中定义的一个抽象方法该方法由子类实现
// public abstract Set<Entry<K,V>> entrySet();
private Iterator<Entry<K,V>> i = entrySet().iterator();
public boolean hasNext() {
return i.hasNext();
}
public K next() {
// 返回 Map.Entry 的 key 值,因为是 keySet()
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);
}
};
}
return keySet;
}
entrySet().iterator()
實現樓主可以看一下 HashMap 中的實現,其實就是一個陣列加鍊錶。樓主了解這2種陣列結構應該就明白了。