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。