黑马程序员技术交流社区

标题: 关于Hashmap键值覆盖问题 [打印本页]

作者: yangqing    时间: 2013-7-21 11:41
标题: 关于Hashmap键值覆盖问题
        HashMap<Studeent,String> hm = new HashMap<Student,String>();
        hm.put(new Student("lisi",38),"北京");
        hm.put(new Student("zhaoliu",24),"上海");
        hm.put(new Student("xiaoqiang",31),"沈阳");
        hm.put(new Student("wangcai",28),"大连");
        hm.put(new Student("zhaoliu",28),"铁岭");
        Set<Student> keySet = hm.keySet();
        Itertor<Student> it =keySet.iterator();//Itertor<Student> it = hm.keySet().iterator();
                while(it.hasNext)(){
                        Student key = it.next();
                        String value = hm.get(key);
                        System.out.println(....)
就是毕老师视频里面那段代码 为什么这么添加的时候 Lisi不会覆盖 。这个键的比较不应该是默认的吗。为什么还要自己加入比较方法?
作者: 杨兴庭    时间: 2013-7-21 11:55
HashMap是以键---值对的方式存储的,  分键集和值集的。。。。。键集和值集都是一一对应的关系的。。。。键集中的键都不重复的在内存中每个键单独开辟空间,是不会被覆盖值的



a.jpg (21.63 KB, 下载次数: 0)

a.jpg

作者: yangqing    时间: 2013-7-21 12:01
杨兴庭 发表于 2013-7-21 11:55
HashMap是以键---值对的方式存储的,  分键集和值集的。。。。。键集和值集都是一一对应的关系的。。。。键 ...

嗯  是我把代码搞错了  我需要问的是当 最后面zhaoliu 年龄也是 24 时 为什么不会覆盖。 加入比较方法为什么又会被覆盖。
作者: 杨兴庭    时间: 2013-7-21 12:06
yangqing 发表于 2013-7-21 12:01
嗯  是我把代码搞错了  我需要问的是当 最后面zhaoliu 年龄也是 24 时 为什么不会覆盖。 加入比较方法为 ...

hashMap中的键是唯一的不可重复的,最后一个也加上zhaoliu   24    用迭代器也能迭代的出来的吗?
作者: 下雨天    时间: 2013-7-21 13:05
这个不会覆盖   因为你传入的是两个不同的student对象 键不算是重复的   当你加入比较方法之后 可能是因为你的比较器把两个student认定为是同一个对象 所以根本没能存到集合中  也不会被遍历出来
作者: yangqing    时间: 2013-7-21 13:09
杨兴庭 发表于 2013-7-21 12:06
hashMap中的键是唯一的不可重复的,最后一个也加上zhaoliu   24    用迭代器也能迭代的出来的吗? ...

嗯  毕老师的解释是 student没有具体的参数比较方法是用equals方法 (比较地址 不一样 就不能判断是相同)。 是继承的person类 要在person加入比较方法才会覆盖 ?  说的都懂 但是不太理解 student继承了person  应该是具有 person的共性才对啊
作者: 杨兴庭    时间: 2013-7-21 13:28
yangqing 发表于 2013-7-21 13:09
嗯  毕老师的解释是 student没有具体的参数比较方法是用equals方法 (比较地址 不一样 就不能判断是相同 ...

不好意思哈,,只顾着说hashMap集合结构了。。。没注意的代码,你的代码装的是student对象,,student对像在装进hashMap之前是要被创建的,通过new在内存中开辟空间的,,,每个对象都有一个地址,

比如说我先new出个“lisi”,在内存中的地址是“a1” , 然后又new出个“lisi”,这时候在内存中的地址是“a2”,,,别忘了一点:集合内存储的是对象的地址    理解这一句我想你的疑问就解决了,,键集中存数的是两个李四在内存中的地址,所以说两个“lisi“   是不会被覆盖的      


第二个问题:比较方法,,,eqalus比较的是两个字符串, "lisi" 和 "lisi"这两个字符串是相同的。。。。。


a2.png (41.35 KB, 下载次数: 0)

画的有点丑见谅

画的有点丑见谅

作者: yangqing    时间: 2013-7-21 13:56
杨兴庭 发表于 2013-7-21 13:28
不好意思哈,,只顾着说hashMap集合结构了。。。没注意的代码,你的代码装的是student对象,,student对 ...

嗯  了解了 thank




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