关于map.values()的一点疑问?

Collection<V> values();

map的values()方法返回的是Collection接口,但是如下代码

Map<Integer,String> map = new TreeMap<Integer,String>();
map.put(1, "one");
map.put(2, "two");
Collection<String> collection = map.values();
System.out.println(collection.size());

却能正确的输出,请问这里collection.size()是调用了哪个子类的方法吗?

其次,

ArrayList<String> list = new ArrayList<String>(map.values());

以接口为参数是因为该接口的子类必然实现了它的方法,但是这里map.values()返回值是Collection接口,那么在

ArrayList(Collection<? extends E> c)

构造方法怎么能行得通呢?


WXWX
浏览 1679回答 1
1回答

yanrun

看一下java的源码(java8):public Collection<V> values() {             Collection<V> vs = values;             if (vs == null) {                     vs = new Values();                     values = vs;             }             return vs;      }可以看出values方法返回的是Values类的对象,再看一下Values类,它是Treemap的一个内部类:class Values extends AbstractCollection<V> {             public Iterator<V> iterator() {                     return new ValueIterator(getFirstEntry());             }             public int size() {                     return TreeMap.this.size();             }             public boolean contains(Object o) {                     return TreeMap.this.containsValue(o);             }             public boolean remove(Object o) {                     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();             }             public Spliterator<V> spliterator() {                     return new ValueSpliterator<K,V>(TreeMap.this, null, null, 0, -1, 0);             }     }Values继承了AbstractCollection,把它看做一个类似ArrayList的集合类就好了
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java