黑马程序员技术交流社区
标题:
map的覆盖是怎么样的
[打印本页]
作者:
qmlovewhr
时间:
2013-7-9 14:27
标题:
map的覆盖是怎么样的
本帖最后由 杨兴庭 于 2013-7-9 21:17 编辑
import java.util.*;
class MapTest3
{
public static void main(String[] args)
{
charCount("aabfcdabcdfa");
}
public static String charCount(String str)
{
char[]chs=str.toCharArray();
TreeMap<Character,Integer>tm=new TreeMap<Character,Integer>();
for(int x=0;x<chs.length;x++)
{
Integer value=tm.get(chs[x]);
if(value==null)
{
tm.put(chs[x],1);
}
else
{
value=value+1;
tm.put(chs[x],value);
}
}
System.out.println(tm);
return null;
}
}
在这段程序中,其中Integer value=tm.get(chs[x]);这句程序让我不解,我们拿先几次循环来说,当第一个字母a进入容器Set中,发现没有value为空,(a,1)就存入到容器中,接着第二个字母
还是a进来,这是value的值在之前变为1后,这次在不等于null的前提下,进行自增+1,变成2.那么就把(a,2)存入容器中,两次的存入就把之前的(a,1)给覆盖了,这样理解正解吗?另外,覆盖
到底是怎么进行的,它怎么知道我就要覆盖这两个数据?
作者:
王靖远
时间:
2013-7-9 15:11
应该是根据key来覆盖的。key是唯一的,找到chs[x]这个key,然后把后面的value覆盖成新的
作者:
草貌路飞
时间:
2013-7-9 15:25
嗯 是根据key来覆盖的,其实只覆盖了value,并没有两个都覆盖。看过Hashmap的实现是通过保存Entry数组来实现的,Entry中就有key和value,覆盖就是遍历这个Entry数组,如果遇到一个Entry对象中的key值和你put的key一样,就把原来的value返回来,把新的value存进去。还有就是判断一样的时候,它用了==和equals()两种判断方法。只要其一为真就属于相同的key了。为什么这样判断你懂的
作者:
左手神刀
时间:
2013-7-9 15:32
Integer value=tm.get(chs[x]); 在第一轮循环中x为0;chs[x] 为a,tm.get(chs[x]); 就相当于tm.get(‘a’); 返回值当然为null;因为这时tm中还没有a这个键。所以就把(a,1)存进去了。a和1的关系是:a为键,1位值,a 映射1,在TreeMap中键是不能重复的,而值是可以重复的。
第二轮循环中x为1,tm.get(chs[x]); 返回的value值不为空,因为第一轮已经存进去(a,1)了。所以就进入了else中。这时value+1为2了, tm.put(chs[x],value);这一句就相当于是 tm.put(a,2); 所以a不在映射1了,而是映射2,这是TreeMap集合中put方法的特点。可以查阅API文档。
{put(K key, V value)将指定值与此映射中的指定键进行关联。如果该映射以前包含此键的映射关系,那么
将替换旧值
。 }
以此类推,最后的结果是{a=4, b=2, c=2, d=2, f=2}。
你的这个代码的含义其实就是在计算aabfcdabcdfa这个字符串中有几个a 几个b 几个c 几个d 几个f
运行结果告诉你 有4个a , 2个b, 2个c, 2个d, 2个f
作者:
张君
时间:
2013-7-9 15:35
Integer value=tm.get(chs[x]);
这句话,是t通过get 方法拿chs[x]去 找对应的的值value ,因为你设的值为Integer 类型,开始你的TreeMap 集合是空的,所以返回的value 是空的。
你说的覆盖,当第一次存入的是(a,1),当第二次拿a 去获取值,得到value=1;然后自增,在存入 变成(a,2), 覆盖以前的(a,1)
它怎么知道要覆盖。是因为它去拿你的key,先去map集合 拿value ,如果value,不为空,就会覆盖的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2