深入源码分析Map与List的关系(2)

现在我们可以发现,HashMap的values()方法表明上返回了一个Values集合对象。但这个集合对象并不能添加元素。它的主要功能是用于遍历HashMap里的所以Value,而遍历Value则主要依赖于HashIterator的nextNode()方法来实现。

nextNode方法源码非常简单:

final Node<K,V> nextNode() { Node<K,V>[] t; Node<K,V> e = next; if (modCount != expectedModCount) throw new ConcurrentModificationException(); if (e == null) throw new NoSuchElementException(); //获取下一个元素 if ((next = (current = e).next) == null && (t = table) != null) { do {} while (index < t.length && (next = t[index++]) == null); } return e; }

与HashMap类似的是,TreeMap的values()方法同样返回了一个Values()对象

class Values extends AbstractCollection<V> { public Iterator<V> iterator() { //以TreeMap中最小的节点创建一个ValueIterator对象 return new ValueIterator(getFirstEntry()); } public int size() { //返回外部类的size()方法 return TreeMap.this.size(); } public boolean contains(Object o) { //调用外部类的containsValue(o)实例方法作为返回值 return TreeMap.this.containsValue(o); } public boolean remove(Object o) { //从TreeMap最小的节点开始循环遍历 for (Entry<K,V> e = getFirstEntry(); e != null; e = successor(e)) { if (valEquals(e.getValue(), o)) { //执行删除 deleteEntry(e); return true; } } return false; } public void clear() { TreeMap.this.clear(); } }

其中执行的successor(Entry

static <K,V> TreeMap.Entry<K,V> successor(Entry<K,V> t) { if (t == null) return null; //如果其右子树存在,搜索右子树中最小的节点(也就是右子数中最左的叶子节点) else if (t.right != null) { //获取右节点 Entry<K,V> p = t.right; //不断搜索左子节点,直到找到最左的叶子节点 while (p.left != null) p = p.left; return p; //如果右子树不存在 } else { Entry<K,V> p = t.parent; Entry<K,V> ch = t; //只要父节点存在,且ch是父节点的右节点 //表明ch大于父节点,循环继续 //直到父节点为null或者ch变成父节点的子节点--此时父节点大于被搜索节点 while (p != null && ch == p.right) { ch = p; p = p.parent; } return p; } }

归纳后我们可以发现:不管是HashMap和TreeMap,它们的values()方法都可以返回其所有value组成的Collection集合–按照通俗的理解,这个Collection集合应该是一个List集合。因为Map的多个Value允许重复。

但实际上,HashMap,TreeMap的values()方法的实现更巧妙。这两个Map对象的values()方法返回的是一个不存储元素的Collection集合,当程序遍历该Collection时,实际就是Map对象的value。

HashMap和TreeMap并没有把value重新组合成一个包含元素的Collection对象,这样就可以减低性能开销。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1b2aaddb120855a0026fcc4af3e091ca.html