黑马程序员技术交流社区

标题: 关于Map中添加的一个问题。 [打印本页]

作者: 逝去的记忆ヽ    时间: 2012-6-19 10:49
标题: 关于Map中添加的一个问题。
本帖最后由 逝去的记忆ヽ 于 2012-6-19 21:49 编辑

直接上代码:
  Map<String,String>  m = new HashMap<String,String>();
  m.put("01","lisi01");//添加元素,这里01键对应的返回值是null.
  System.out.println(m.put("01","lisi011"));//这里键值返回的是lisi01.我的问题就是当打印这句的时候01键值还是lisi01,可到后面打印的时候就是lisi011,那么这个put方法在内存中的存储
                                                               状况,和改变状况是什么样的? 请用图来说明。
                                                               
  m.put("02","lisi02");
  m.put("03","lisi03");
  System.out.println("contains值为:"+m.containsValue("lisi01"));//返回值会boolean型。这里打印结果为false.






作者: 胡卿    时间: 2012-6-19 11:07
put方法添加元素首先会判断内部存不存在相同的健,如果不存在,则存入,返回null,
                                                                       如果存在,则替换存入,返回旧健对应的值,但是这时候集合中存在的是新健对应的值
                                                所以最后打印必然是lisi011,所以你的结果为false

作者: 孙安庆    时间: 2012-6-19 14:40
API文档中是这样说的
put
public V put(K key,
             V value)在此映射中关联指定值与指定键。如果该映射以前包含了一个该键的映射关系,则旧值被替换。

指定者:
接口 Map<K,V> 中的 put
覆盖:
类 AbstractMap<K,V> 中的 put
参数:
key - 指定值将要关联的键
value - 指定键将要关联的值
返回:
与 key 关联的旧值;如果 key 没有任何映射关系,则返回 null。(返回 null 还可能表示该映射之前将 null 与 key 关联。)
PS:一般不会把null作为键或者值,虽然这样可以

作者: 龙秋地    时间: 2012-6-19 15:37
本帖最后由 龙秋地 于 2012-6-19 15:39 编辑
  1. 我的问题就是当打印这句的时候01键值还是lisi01,可到后面打印的时候就是lisi011,那么这个put方法在内存中的存储状况,和改变状况是什么样的? 请用图来说明
复制代码
答:
<Map K,V>中put()方法:
V put(K key, V value)
          将指定的值与此映射中的指定键相关联(可选操作)。

如果此映射中以前包含一个该键的映射关系,则用指定值替换旧值(当且仅当 m.containsKey(k) 返回 true 时,才能说映射 m 包含键 k 的映射关系)。
参数:
key - 与指定值相关联的键。
value - 与指定键相关联的值。
返回:
以前与指定键相关联的值,如果没有该键的映射关系,则返回 null。
如果该实现支持 null 值,则返回 null 也可表明此映射以前将 null 与指定键相关联。
如果已经有对应的值,则替换存入新值,返回旧健对应的值.
这就可以解释,为什么你明明put的是"lisi011",但是返回的是曾经的旧值,就是"lisi01".
但是接着你继续打印的话,那么就变成之前你存入的"lisi011"的值.
C:\Documents and Settings\Administrator\桌面




键值对.jpg (48.08 KB, 下载次数: 26)

键值对.jpg





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