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
提交
取消
