天天看点

TreeMap源码分析七

转自:http://www.fengfly.com/plus/view-213898-8.html

获取所有键值对集合

entrySet() 返回“键值对集合”。顾名思义,它返回的是一个集合,集合的元素是“键值对”。

下面,我们看看它是如何实现的?entrySet() 的实现代码如下:

  1. public Set<Map.Entry<K,V>> entrySet() {  
  2.     EntrySet es = entrySet;  
  3.     return (es != null) ? es : (entrySet = new EntrySet());  
  4. }  

说明:entrySet()返回的是一个EntrySet对象。

下面我们看看EntrySet的代码:

  1. // EntrySet是“TreeMap的所有键值对组成的集合”,  
  2. // EntrySet集合的单位是单个“键值对”。  
  3. class EntrySet extends AbstractSet<Map.Entry<K,V>> {  
  4.     public Iterator<Map.Entry<K,V>> iterator() {  
  5.         return new EntryIterator(getFirstEntry());  
  6.     }  
  7.     // EntrySet中是否包含“键值对Object”  
  8.     public boolean contains(Object o) {  
  9.         if (!(o instanceof Map.Entry))  
  10.             return false;  
  11.         Map.Entry<K,V> entry = (Map.Entry<K,V>) o;  
  12.         V value = entry.getValue();  
  13.         Entry<K,V> p = getEntry(entry.getKey());  
  14.         return p != null && valEquals(p.getValue(), value);  
  15.     }  
  16.     // 删除EntrySet中的“键值对Object”  
  17.     public boolean remove(Object o) {  
  18.         if (!(o instanceof Map.Entry))  
  19.             return false;  
  20.         Map.Entry<K,V> entry = (Map.Entry<K,V>) o;  
  21.         V value = entry.getValue();  
  22.         Entry<K,V> p = getEntry(entry.getKey());  
  23.         if (p != null && valEquals(p.getValue(), value)) {  
  24.             deleteEntry(p);  
  25.             return true;  
  26.         }  
  27.         return false;  
  28.     }  
  29.     // 返回EntrySet中元素个数  
  30.     public int size() {  
  31.         return TreeMap.this.size();  
  32.     }  
  33.     // 清空EntrySet  
  34.     public void clear() {  
  35.         TreeMap.this.clear();  
  36.     }  

说明:

EntrySet是“TreeMap的所有键值对组成的集合”,而且它单位是单个“键值对”。

EntrySet是一个集合,它继承于AbstractSet。而AbstractSet实现了除size() 和 iterator() 之外的其它函数,因此,我们重点了解一下EntrySet的size() 和 iterator() 函数

size() 的实现非常简单,AbstractSet集合中元素的个数=该TreeMap的元素个数。

iterator() 则返回一个迭代器,用于遍历AbstractSet。从上面的源码中,我们可以发现iterator() 是通过EntryIterator实现的;下面我们看看EntryIterator的源码:

  1. final class EntryIterator extends PrivateEntryIterator<Map.Entry<K,V>> {  
  2.     EntryIterator(Entry<K,V> first) {  
  3.         super(first);  
  4.     }  
  5.     public Map.Entry<K,V> next() {  
  6.         return nextEntry();  
  7.     }  
  8. }  

说明:和Values类一样,EntryIterator也继承于PrivateEntryIterator类。