首页 新闻 会员 周边

aMap.values()方法的返回值为什么不用List而用Collection?

0
悬赏园豆:5 [待解决问题]
Map map = new HashMap();

Set keySet = map.keySet();
//key是不能重复的,所以源码中用Set来接收返回值

Collection values = map.values();
//value是可以重复的,那为什么源码中不用List来接收返回值,而要用Collection来接收呢?

不可为awen的主页 不可为awen | 初学一级 | 园豆:194
提问于:2022-04-24 16:15
< >
分享
所有回答(2)
0

Collection 是一个接口, List是具体的实现. 返回接口的好处是假设以后hasmap内部的实现有改动. api的签名不用变.

czd890 | 园豆:14412 (专家六级) | 2022-04-28 12:10

不对吧,Collection 是一个接口, List 是继承了Collection 接口的子接口。
这里主要问题是:既然List和Set都是Collection的子接口,而且keySet是Set类型的,那为什么values不是和Set “平级” 的List类型,而是上一级的Collection类型呢?

另外,“假设以后hasmap内部的实现有改动”,您的这句话我还不太理解。

支持(0) 反对(0) 不可为awen | 园豆:194 (初学一级) | 2022-04-29 21:58
0

因为 Collection 是一个最上层的集合抽象接口。
1.这样写更加符合依赖倒置原则(Dependence Inversion Principle);你应该是依赖上层的抽象而不是更具体一些的实现接口,好处是调用方依赖的是接口,使得不管你的实现如何改变,调用方都不必跟着改变。
2.因为这个方法是Map接口的方法,使用 Collection 可以给实现类提供更大的操作空间,实现类可以返回Set可以返回List。

Raiden_xin | 园豆:273 (菜鸟二级) | 2022-04-29 21:40

感谢答疑,大概懂了。
在jdk8的源码中,HashMap的values方法如下:

    public Collection<V> values() {
        Collection<V> vs = values;
        if (vs == null) {
            vs = new Values();
            values = vs;
        }
        return vs;
    }

上面代码return的是一个Values对象,且Values类实现了Collection接口。
您的意思是:在Map接口的其他实现类中,values方法return的可能是Set、List、或者其他Collection的子接口(如果有的话),因此才使用Collection来接收返回值,对吧?

支持(0) 反对(0) 不可为awen | 园豆:194 (初学一级) | 2022-04-29 22:11

@不可为awen: 嗯,差不多是这个意思。

支持(0) 反对(0) Raiden_xin | 园豆:273 (菜鸟二级) | 2022-04-30 17:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册