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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 ╭月牙湾湾╮ 于 2014-6-13 19:53 编辑

Set<Map.Entry<Person, String>> set = tm.entrySet();
Iterator<Map.Entry<Person, String>>  it = set.iterator();
while(it.hasNext()){
       Map.Entry<Person, String> me = it.next();
       Person p = me.getKey();
       String value = me.getValue();
       System.out.println(p+"..."+value);
}
如上带代码,tm.entrySet()方法为什么会返回一个Set集合?it.next()为什么返回的是Map.Entry,Map.Entry是什么?请详细说明
               

15 个回复

倒序浏览
本帖最后由 ender 于 2014-6-12 08:30 编辑

entrySet()方法是Map接口中的一个方法,该方法的主要内容就是创造一个Entry接口的子类实例,因为Entry接口是Map接口的内部接口,外部访问需要建立实例对象,比较麻烦,所以Map接口直接提供一个可以建立其实例的访问方式,通过访问该方法可以给你返回一个Entry接口的子类实例对象,这样你就可以直接调用Entry接口里面的方法了,所以该方法entrySet()的返回值是Entry接口的一个子类实例对象,其类型肯定就是Entry类类型了,又因为Entry是Map接口的内部接口,根据内部类的访问规则,所以这里表示Entry类类型就肯定要带上Map类了,如果非静态就还要用new来表示,不过Java比较人性化,直接用静态的,所以书写就方便多了。

亲,理解乎?:lol
回复 使用道具 举报
tm.entrySet()是将map里的每一个键值对取出来封装成一个Entry对象在存到一个Set里面,迭代器it要迭代的就是set里保存的entry对象,所以it.next会返回Map.Entry对象,Map.Entry就是一个保存map键值对的对象
回复 使用道具 举报
1、entrySet()方法是在Map接口当中,每一个它的实现类,对其方法有不同的实现方式。因为其类的底层数据结构不同。
2、为什么该方法要返回Set集合:可能是Map与Set有一定关系,如果查过Set源代码的人应该知道,Set集合存放数据的时候,使用Map进行存储,Set集合存放的数据都添加到Map的键值当中,因为键值是唯一,也就是Set集合中元素是唯一的特性。
3、next()方法为什么返回Map.Entry:是因为enrtySet方法返回的Set集合中存放就是Map.Entry类型的数据,其实Set集合中存放是Map集合中每一对的映射关系。
4、Map.Entry是Map的一个内部接口,对于Entry是Map内部的特有方式,所以Map就将其定义成内部接口。
回复 使用道具 举报
ender 发表于 2014-6-12 08:28
entrySet()方法是Map接口中的一个方法,该方法的主要内容就是创造一个Entry接口的子类实例,因为Entry接口 ...

:(好难理解。。。

点评

坛友好人,赞一个。不过这个问题昨天下午终于想明白了,有其他问题再麻烦你咯。  发表于 2014-6-13 19:49
哪里难理解呢 可具体提供剖析  发表于 2014-6-13 07:55
回复 使用道具 举报
你这问题一看就是跟我一个班的。。。。
回复 使用道具 举报
面向大众 发表于 2014-6-12 15:22
你这问题一看就是跟我一个班的。。。。

这话要是让老师听见了,咱老师要情何以堪
回复 使用道具 举报
没事儿,他不知道。哈哈

点评

呵呵!  发表于 2014-6-12 15:53
回复 使用道具 举报
tm.entrySet()方法为什么会返回一个Set集合?
答:函数的返回值是set,没有原因
?it.next()为什么返回的是Map.Entry?
答:因为泛型是Map.Entry类型
Map.Entry是什么?
答:一种类型,Map的一种附带类型,我的理解啊
回复 使用道具 举报
郝义涛 发表于 2014-6-12 16:01
tm.entrySet()方法为什么会返回一个Set集合?
答:函数的返回值是set,没有原因
?it.next()为什么返回的是 ...

好抽象的说法,估计你自己明白,但是不好表述吧
回复 使用道具 举报
谢谢大家的解答,通过大家的回答和我自己的研究,我弄懂了这些疑惑。
因为Map集合本身不具有迭代器方法,不能直接获取集合中的键值对。通过Map接口的entrySet()方法可以取出Map集合中的键值对关系,而这个关系就是Map.Entry类型。而entrySet()方法的返回值是一个Set集合,所以这个关系被取出后会被虚拟机存储到Set集合中,之后迭代Set集合,因为Set集合里存储的就是Map.Entry类型数据,所以it.next()取出元素时返回的也是Map.Entry。
不知道自己说的对不对。有错误希望坛里的大神能帮忙纠正。
回复 使用道具 举报
Wokno 中级黑马 2014-6-13 22:39:00
12#
路过看看。。。。。。。。。。
回复 使用道具 举报
╭月牙湾湾╮ 发表于 2014-6-13 19:52
谢谢大家的解答,通过大家的回答和我自己的研究,我弄懂了这些疑惑。
因为Map集合本身不具有迭代器方法,不 ...

恩嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯呃
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马