Map和List

Map集合是一个关联数组,它包含两组值:一组是所有key组成的集合,因为Map集合的key不允许重复,而且Map不会保存key加入的顺序,因此这些key可以组成一个Set集合;另外一组是value组成的集合,因为Map集合的value完全可以重复,而且Map可以根据key来获取对应的value,所以这些value可以组成一个List集合。

实际上,Map的values方法并未返回一个List集合,

HashMap和TreeMap2个集合的vlaues()方法返回值确实是包含Map中所有value的集合,但它们并不是List对象,而分别是HashMap$Values对象和TreeMap$Values对象。

private final class Values extends AbstractCollection<V>
      {
            public Iterator<V> iterator()
            {
                //返回newValueIterator()方法的返回值
                return newValueIterator();
            }
            public int size()
            {
                //返回外部类实例的size实例变量的返回值
                return size;
            }
            public boolean contains(Object o)
            {
                //返回外部类实例的containsValue(o)的返回值作为本方法的返回值
                return containsValue(o);
            }
            public void clear()
            {
                //调用其外部类实例的clear()方法
                HashMap.this.clear();
            }
      }

注意上面这个Values集合类,它虽然继承了AbstractCollection抽象类,但并不是一个真正的Collection集合。因为它并未实现add(Object e)方法,而且AbstractCollection抽象类也没有实现add(Object e)方法,也就是说,这个Values集合对象并没有真正盛装任何Java对象。

上面Values 内部类的iterator()方法实际上通过调用外部类对象的newValueIterator()方法实现。newValueIterator()方法的源代码如下。

Iterator<V> newValueIterator()

{

return new ValueIterator();

}

上面newValueIterator()方法直接返回一个ValueIterator对象。此处不难发现,JDK在此处实现得略嫌不足。其实newValueIterator()方法并没有太多的存在价值,完全可以直接在Values类的iterator()方法实现中执行return new ValueIterator();。

ValueIterator类的实现非常简单,它是通过调用HashMap的nextEntry()方法来实现的。下面是该类的源代码。

 private final class ValueIterator extends HashIterator<V>
      {
            public V next()
            {
              //返回nextEntry()方法返回的Entry的value
              return nextEntry().value;
            }
      }

经过上面的系列讲解可以发现,HashMap的values()方法表面上返回了一个Values 集合对象,但这个集合对象并不能添加元素

从底层实现来上看,Set和Map很相似;如果从用法的角度来看,Map和List也有很大的相似之处:

■ Map接口提供了get(K key)方法允许Map对象根据key来取得value;

■ List接口提供了get(int index)方法允许List对象根据元素索引来取得value。

Map和List底层实现上并没有太大的相似之处,只是在用法上存在一些相似之处:既可以说List相当于所有key都是int类型的Map,也可以说Map相当于索引是任意类型的List。

猜你喜欢

转载自blog.csdn.net/qq_37256896/article/details/103325364