黑马程序员技术交流社区

标题: 关于Map集合中的keySet()方法。 [打印本页]

作者: muffin    时间: 2015-8-23 13:36
标题: 关于Map集合中的keySet()方法。
在毕老师的视频中,有这样一句代码。
Set<String> keyset=map.keySet();
那么问题来了,Set是一个接口,对象必须是这个接口的一个子类的对象。
那么返回值是肯定不是一个new Set()吧。如果是多态的话,那返回的这个集合是哪个子类的对象呢?HashSet?TreeSet?

作者: 史柯    时间: 2015-8-24 12:59
看你的Map是哪个类型的。
TreeMap对应TreeSet
作者: pengbeilin    时间: 2015-8-24 18:09
本帖最后由 pengbeilin 于 2015-8-24 21:06 编辑

不一定哦,返回值可能就是一个Set,我猜测keySet方法的底层可能是用匿名内部类写的 返回Set对象,这里最主要的是获取迭代器对象Iterator ,而Set对象是也有获取迭代器的方法。这是我的个人想法

作者: pengbeilin    时间: 2015-8-24 18:10
本帖最后由 pengbeilin 于 2015-8-24 21:07 编辑


作者: muffin    时间: 2015-8-24 19:52
pengbeilin 发表于 2015-8-24 18:09
不一定哦,返回值可能就是一个Set,我猜测keySet方法的底层可能是用匿名内部类写的 返回Set对象,这里最主 ...

我查了源码,其实它是定义了一个类,这个类继承了List中的一个子类。然后这个keySet()方法就返回了定义的这个类的对象。也就是说返回了一个自己定义的容器实体。
作者: pengbeilin    时间: 2015-8-24 20:12
muffin 发表于 2015-8-24 19:52
我查了源码,其实它是定义了一个类,这个类继承了List中的一个子类。然后这个keySet()方法就返回了定义的 ...

是List集合的子类,那这个类肯定也是Set集合的子类吧
作者: lion_good    时间: 2015-8-25 00:25
以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
muffin 发表于 2015-8-24 19:52
我查了源码,其实它是定义了一个类,这个类继承了List中的一个子类。然后这个keySet()方法就返回了定义的 ...

好几天没上了,抓紧自学基础呢,打算报javaEE9月16日那个班,不过感觉时间很紧啊,你是已经工作了还是也
在学习呢啊。
作者: 血马雄风    时间: 2015-8-29 16:31
应该是HashSet,    去看代码吧
作者: wyd1    时间: 2015-8-29 17:22
你定义的是谁,返回的就是谁




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2