TreeMap源码分析六

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

返回所有的value


values()的实现代码如下:

 
  1. public Collection<V> values() {  
  2.     Collection<V> vs = values;  
  3.     return (vs != null) ? vs : (values = new Values());  
  4. }  

说明:从中,我们可以发现values()是通过 new Values() 来实现 “返回TreeMap中值的集合”。

那么Values()是如何实现的呢? 没错!由于返回的是值的集合,那么Values()肯定返回一个集合;而Values()正好是集合类Value的构造函数。Values继承于AbstractCollection,它的代码如下:

 
  1. // ”TreeMap的值的集合“对应的类,它集成于AbstractCollection  
  2. class Values extends AbstractCollection<V> {  
  3.     // 返回迭代器  
  4.     public Iterator<V> iterator() {  
  5.         return new ValueIterator(getFirstEntry());  
  6.     }  
  7.  
  8.     // 返回个数  
  9.     public int size() {  
  10.         return TreeMap.this.size();  
  11.     }  
  12.  
  13.     // "TreeMap的值的集合"中是否包含"对象o"  
  14.     public boolean contains(Object o) {  
  15.         return TreeMap.this.containsValue(o);  
  16.     }  
  17.  
  18.     // 删除"TreeMap的值的集合"中的"对象o"  
  19.     public boolean remove(Object o) {  
  20.         for (Entry<K,V> e = getFirstEntry(); e != null; e = successor(e)) {  
  21.             if (valEquals(e.getValue(), o)) {  
  22.                 deleteEntry(e);  
  23.                 return true;  
  24.             }  
  25.         }  
  26.         return false;  
  27.     }  
  28.  
  29.     // 清空删除"TreeMap的值的集合"  
  30.     public void clear() {  
  31.         TreeMap.this.clear();  
  32.     }  

说明:从中,我们可以知道Values类就是一个集合。而 AbstractCollection 实现了除 size() 和 iterator() 之外的其它函数,因此只需要在Values类中实现这两个函数即可。
size() 的实现非常简单,Values集合中元素的个数=该TreeMap的元素个数。(TreeMap每一个元素都有一个值嘛!)
iterator() 则返回一个迭代器,用于遍历Values。下面,我们一起可以看看iterator()的实现:

 
  1. public Iterator<V> iterator() {  
  2.     return new ValueIterator(getFirstEntry());  
  3. }  

说明: iterator() 是通过ValueIterator() 返回迭代器的,ValueIterator是一个类。代码如下:

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

说明:ValueIterator的代码很简单,它的主要实现应该在它的父类PrivateEntryIterator中。下面我们一起看看PrivateEntryIterator的代码:

 
  1. abstract class PrivateEntryIterator<T> implements Iterator<T> {  
  2.     // 下一节点  
  3.     Entry<K,V> next;  
  4.     // 上一次返回的节点  
  5.     Entry<K,V> lastReturned;  
  6.     // 修改次数统计数  
  7.     int expectedModCount;  
  8.  
  9.     PrivateEntryIterator(Entry<K,V> first) {  
  10.         expectedModCount = modCount;  
  11.         lastReturned = null;  
  12.         next = first;  
  13.     }  
  14.  
  15.     // 是否存在下一个节点  
  16.     public final boolean hasNext() {  
  17.         return next != null;  
  18.     }  
  19.  
  20.     // 返回下一个节点  
  21.     final Entry<K,V> nextEntry() {  
  22.         Entry<K,V> e = next;  
  23.         if (e == null)  
  24.             throw new NoSuchElementException();  
  25.         if (modCount != expectedModCount)  
  26.             throw new ConcurrentModificationException();  
  27.         next = successor(e);  
  28.         lastReturned = e;  
  29.         return e;  
  30.     }  
  31.  
  32.     // 返回上一节点  
  33.     final Entry<K,V> prevEntry() {  
  34.         Entry<K,V> e = next;  
  35.         if (e == null)  
  36.             throw new NoSuchElementException();  
  37.         if (modCount != expectedModCount)  
  38.             throw new ConcurrentModificationException();  
  39.         next = predecessor(e);  
  40.         lastReturned = e;  
  41.         return e;  
  42.     }  
  43.  
  44.     // 删除当前节点  
  45.     public void remove() {  
  46.         if (lastReturned == null)  
  47.             throw new IllegalStateException();  
  48.         if (modCount != expectedModCount)  
  49.             throw new ConcurrentModificationException();  
  50.         // deleted entries are replaced by their successors  
  51.         if (lastReturned.left != null && lastReturned.right != null)  
  52.             next = lastReturned;  
  53.         deleteEntry(lastReturned);  
  54.         expectedModCount = modCount;  
  55.         lastReturned = null;  
  56.     }  

说明:PrivateEntryIterator是一个抽象类,它的实现很简单,只只实现了Iterator的remove()和hasNext()接口,没有实现next()接口。
而我们在ValueIterator中已经实现的next()接口。
至此,我们就了解了iterator()的完整实现了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值