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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangqing 中级黑马   /  2013-7-21 11:41  /  3595 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        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不会覆盖 。这个键的比较不应该是默认的吗。为什么还要自己加入比较方法?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
HashMap是以键---值对的方式存储的,  分键集和值集的。。。。。键集和值集都是一一对应的关系的。。。。键集中的键都不重复的在内存中每个键单独开辟空间,是不会被覆盖值的



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

a.jpg
回复 使用道具 举报
杨兴庭 发表于 2013-7-21 11:55
HashMap是以键---值对的方式存储的,  分键集和值集的。。。。。键集和值集都是一一对应的关系的。。。。键 ...

嗯  是我把代码搞错了  我需要问的是当 最后面zhaoliu 年龄也是 24 时 为什么不会覆盖。 加入比较方法为什么又会被覆盖。
回复 使用道具 举报
yangqing 发表于 2013-7-21 12:01
嗯  是我把代码搞错了  我需要问的是当 最后面zhaoliu 年龄也是 24 时 为什么不会覆盖。 加入比较方法为 ...

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

嗯  毕老师的解释是 student没有具体的参数比较方法是用equals方法 (比较地址 不一样 就不能判断是相同)。 是继承的person类 要在person加入比较方法才会覆盖 ?  说的都懂 但是不太理解 student继承了person  应该是具有 person的共性才对啊
回复 使用道具 举报
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)

画的有点丑见谅

画的有点丑见谅

评分

参与人数 1技术分 +1 黑马币 +10 收起 理由
万琪 + 1 + 10 神马都是浮云

查看全部评分

回复 使用道具 举报
杨兴庭 发表于 2013-7-21 13:28
不好意思哈,,只顾着说hashMap集合结构了。。。没注意的代码,你的代码装的是student对象,,student对 ...

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