A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© muffin 中级黑马   /  2015-8-23 13:36  /  656 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在毕老师的视频中,有这样一句代码。
Set<String> keyset=map.keySet();
那么问题来了,Set是一个接口,对象必须是这个接口的一个子类的对象。
那么返回值是肯定不是一个new Set()吧。如果是多态的话,那返回的这个集合是哪个子类的对象呢?HashSet?TreeSet?

9 个回复

倒序浏览
看你的Map是哪个类型的。
TreeMap对应TreeSet
回复 使用道具 举报
本帖最后由 pengbeilin 于 2015-8-24 21:06 编辑

不一定哦,返回值可能就是一个Set,我猜测keySet方法的底层可能是用匿名内部类写的 返回Set对象,这里最主要的是获取迭代器对象Iterator ,而Set对象是也有获取迭代器的方法。这是我的个人想法
回复 使用道具 举报
本帖最后由 pengbeilin 于 2015-8-24 21:07 编辑

回复 使用道具 举报
pengbeilin 发表于 2015-8-24 18:09
不一定哦,返回值可能就是一个Set,我猜测keySet方法的底层可能是用匿名内部类写的 返回Set对象,这里最主 ...

我查了源码,其实它是定义了一个类,这个类继承了List中的一个子类。然后这个keySet()方法就返回了定义的这个类的对象。也就是说返回了一个自己定义的容器实体。
回复 使用道具 举报
muffin 发表于 2015-8-24 19:52
我查了源码,其实它是定义了一个类,这个类继承了List中的一个子类。然后这个keySet()方法就返回了定义的 ...

是List集合的子类,那这个类肯定也是Set集合的子类吧
回复 使用道具 举报
以HashMap举例
  1. public class HashMap<K,V> extends AbstractMap<K,V>
  2.     implements Map<K,V>, Cloneable, Serializable {

  3.   //...
  4.         transient volatile Set<K>        keySet;
  5.     public Set<K> keySet() {
  6.         Set<K> ks;
  7.         return (ks = keySet) == null ? (keySet = new KeySet()) : ks;
  8.     }

  9.     final class KeySet extends AbstractSet<K> {
  10.        //...
  11.     }

  12.     //...

  13. }
复制代码

keySet()方法创建(创建后缓存在keySet变量中,方便下次快速访问)了一个KeySet类的对象,而KeySet是HashMap的一个内部类
回复 使用道具 举报
muffin 中级黑马 2015-8-29 14:49:50
8#
muffin 发表于 2015-8-24 19:52
我查了源码,其实它是定义了一个类,这个类继承了List中的一个子类。然后这个keySet()方法就返回了定义的 ...

好几天没上了,抓紧自学基础呢,打算报javaEE9月16日那个班,不过感觉时间很紧啊,你是已经工作了还是也
在学习呢啊。
回复 使用道具 举报
应该是HashSet,    去看代码吧
回复 使用道具 举报
wyd1 中级黑马 2015-8-29 17:22:59
10#
你定义的是谁,返回的就是谁
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马