转自:http://www.fengfly.com/plus/view-213898-8.html
获取所有键值对集合
entrySet() 返回“键值对集合”。顾名思义,它返回的是一个集合,集合的元素是“键值对”。
下面,我们看看它是如何实现的?entrySet() 的实现代码如下:
- public Set<Map.Entry<K,V>> entrySet() {
- EntrySet es = entrySet;
- return (es != null) ? es : (entrySet = new EntrySet());
- }
说明:entrySet()返回的是一个EntrySet对象。
下面我们看看EntrySet的代码:
- // EntrySet是“TreeMap的所有键值对组成的集合”,
- // EntrySet集合的单位是单个“键值对”。
- class EntrySet extends AbstractSet<Map.Entry<K,V>> {
- public Iterator<Map.Entry<K,V>> iterator() {
- return new EntryIterator(getFirstEntry());
- }
- // EntrySet中是否包含“键值对Object”
- public boolean contains(Object o) {
- if (!(o instanceof Map.Entry))
- return false;
- Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
- V value = entry.getValue();
- Entry<K,V> p = getEntry(entry.getKey());
- return p != null && valEquals(p.getValue(), value);
- }
- // 删除EntrySet中的“键值对Object”
- public boolean remove(Object o) {
- if (!(o instanceof Map.Entry))
- return false;
- Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
- V value = entry.getValue();
- Entry<K,V> p = getEntry(entry.getKey());
- if (p != null && valEquals(p.getValue(), value)) {
- deleteEntry(p);
- return true;
- }
- return false;
- }
- // 返回EntrySet中元素个数
- public int size() {
- return TreeMap.this.size();
- }
- // 清空EntrySet
- public void clear() {
- TreeMap.this.clear();
- }
- }
说明:
EntrySet是“TreeMap的所有键值对组成的集合”,而且它单位是单个“键值对”。
EntrySet是一个集合,它继承于AbstractSet。而AbstractSet实现了除size() 和 iterator() 之外的其它函数,因此,我们重点了解一下EntrySet的size() 和 iterator() 函数
size() 的实现非常简单,AbstractSet集合中元素的个数=该TreeMap的元素个数。
iterator() 则返回一个迭代器,用于遍历AbstractSet。从上面的源码中,我们可以发现iterator() 是通过EntryIterator实现的;下面我们看看EntryIterator的源码:
- final class EntryIterator extends PrivateEntryIterator<Map.Entry<K,V>> {
- EntryIterator(Entry<K,V> first) {
- super(first);
- }
- public Map.Entry<K,V> next() {
- return nextEntry();
- }
- }
说明:和Values类一样,EntryIterator也继承于PrivateEntryIterator类。