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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章