1.经过翻看hashMap的源码,发现并没有主动地去维护entrySet,比如put的时候去存值或者调用entrySet()去维护值,那entryset的值从哪而来呢?
2.hashMap源码
public Set<Map.Entry<K,V>> entrySet() {
Set<Map.Entry<K,V>> es;
return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}
final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
public final int size() { return size; }
public final void clear() { HashMap.this.clear(); }
public final Iterator<Map.Entry<K,V>> iterator() {
return new EntryIterator();
}
}
3.本人的测试例子:
Map map = new HashMap();
map.put(1, 1);
map.put(2, 2);
Set set = map.entrySet();
Iterator iterator = set.iterator();
debug发现这个时候set已经有值了,很是费解。iterator也在调用next方法之前就能看到值。
//iterator源码
public final Iterator<Map.Entry<K,V>> iterator() {
return new EntryIterator();
}
final class EntryIterator extends HashIterator
implements Iterator<Map.Entry<K,V>> {
public final Map.Entry<K,V> next() { return nextNode(); }
}
4.感觉自己说的好混乱,再来阐述一遍问题,entrySet还有它的iterator是怎么维护的?
我看了一下,理解如下
当你调用这个方法时
会初始化一个 EntrySet。
你调用 iterator()时会初始化一个 EntryIterator。
这个 EntryIterator 是直接调用的 HashMap.HashIterator.nextNode()
初始化 EntryIterator 时会初识化其父类 HashIterator
put的时候会向这个 table 中维护,所以不需要维护 EntrySet 因为它本身不需要存储数据