黑马程序员技术交流社区

标题: Map中的疑问 [打印本页]

作者: 李万海    时间: 2013-3-24 09:33
标题: Map中的疑问
本帖最后由 李万海 于 2013-3-28 18:45 编辑

在使用HashMap和map.entry时候,在Set集合中也可以这样用
Set<Entry<String, Integer>> entryset=entry.entrySet();
                  for(Entry<String, Integer> ent:entryset){
                          System.out.println(ent);
也可以这样用
Set<Map.Entry<String, Integer>> entryset=entry.entrySet();
                  for(Map.Entry<String, Integer> ent:entryset){
                          System.out.println(ent);
这两者有什么区别吗?

作者: lucy198921    时间: 2013-3-24 10:54
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。
它表示Map中的一个实体(一个key-value对)。
接口中有getKey(),getValue方法。

Entry:

这是一个HashMap类的内部静态类,实现了Map.Entry接口。
接受两个模板参数K和V.key和hash一旦在构造函数中被初始化,就不可改变,
并且由于有next的存在,Entry可以构成一个单向链表。
作者: lucy198921    时间: 2013-3-24 11:00
lucy198921 发表于 2013-3-24 10:54
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry。
它表示Map中的一个实体(一个key-value对 ...

另外需要了解的是:

HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据 Hash 算法来决定其存储位置;当需要取出一个 Entry 时,也会根据 Hash 算法找到其存储位置,直接取出该 Entry。由此可见:HashMap 之所以能快速存、取它所包含的 Entry,完全类似于现实生活中母亲从小教我们的:不同的东西要放在不同的位置,需要时才能快速找到它。

当创建 HashMap 时,有一个默认的负载因子(load factor),其默认值为 0.75,这是时间和空间成本上一种折衷:增大负载因子可以减少 Hash 表(就是那个 Entry 数组)所占用的内存空间,但会增加查询数据的时间开销,而查询是最频繁的的操作(HashMap 的 get() 与 put() 方法都要用到查询);减小负载因子会提高数据查询的性能,但会增加 Hash 表所占用的内存空间。
作者: 黑马-郑玉元    时间: 2013-3-28 20:34
我来说两句吧!楼上说的我不敢苟同!我觉得他们是一样的,只是写法的表达方式不一样而已!刚好今天我刚看了张老师的视频讲到这么一个问题,他的原话是这样说的,Entry其他集合不可以用,只能用在map集合中,为了表示这种特殊的关系,就命名为Map.Entry。这就是张老师的原话。这个接口里面有五个方法,要想迭代集合,就需要调用里面的两个方法getKey()和getValue();我想你编码的目的是为了迭代打印集合吧,你这样ent.getKey()就拿到键,ent.getValue()就拿到值,这样你就可以迭代集合了!这是map集合迭代的一种方式,还有另一种是keySet()方法。




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