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)构造方法怎么能行得通呢?
1 回答

yanrun
TA贡献317条经验 获得超240个赞
看一下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的集合类就好了
添加回答
举报
0/150
提交
取消