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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄克帅 中级黑马   /  2012-6-2 17:05  /  1352 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄克帅 于 2012-6-11 13:34 编辑

为什么自己创建的对象,put方法放入Map的时候覆盖不了相同的key。而我直接用Integer 对象 就会覆盖相同key的value


public class Zi {
        private String name;
        private int age;

        public Zi(String name, int age) {
                super();
                this.name = name;
                this.age = age;
        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }

}

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class Test {

        public static void main(String[] args) {
                HashMap<Zi, String> hm = new HashMap<Zi, String>();
                hm.put(new Zi("aa",1), "a");
                hm.put(new Zi("bb",2), "b");
                hm.put(new Zi("cc",3), "c");
                hm.put(new Zi("aa",1), "d");
               
                Set<Zi> zi = hm.keySet();
               
                Iterator<Zi>it =zi.iterator();
                while(it.hasNext()){
                        Zi str = it.next();
                        System.out.println(str.getAge()+"---"+str.getName()+"---"+hm.get(str));
                        //这里打印
                        //1---aa---a
                        //3---cc---c
                        //1---aa---d
                        //2---bb---b
                        // put方法不是重复key对应的value的会被覆盖吗,这里为什么没有覆盖
                }
               
                HashMap<Integer, String> hm1 = new HashMap<Integer, String>();
                hm1.put(1, "a");
                hm1.put(2, "b");
                hm1.put(3, "c");
                hm1.put(1, "d");
               
                Set<Integer> in = hm1.keySet();
                Iterator<Integer> ite = in.iterator();
                while(ite.hasNext()){
                        Integer inte =ite.next();
                        System.out.println(inte+"---"+hm1.get(inte));
                        //这里打印
                        //1---d
                        //2---b
                        //3---c
                        //这里重复key对应的value被覆盖了

                }
               
        }

}

4 个回复

倒序浏览
视频上老师讲过了,你自定义的类如果存放到HashMap中要根据键的类型重写hashCode方法和equals方法,这样才能进行对比的

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 一针见血~~

查看全部评分

回复 使用道具 举报
你可以做个这样的小测试:
public class T {
        public static void main(String[] args) {

                Zi A1=new Zi("aa",1);
                Zi A2=new Zi("aa",1);
                System.out.print(A1==A2);
        }
输出结果为false;说明两次new的是两个不同的对象,他们指向的不是同一个对象。
所以put方法中key值没有重复 ,对应的value的也不会被覆盖。

评分

参与人数 1黑马币 +10 收起 理由
黄奕豪 + 10 上面的回答对了,鼓励下~~~

查看全部评分

回复 使用道具 举报
在Zi类里复写hashcode 和equals方法就好了
public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
}


public boolean equals(Object obj) {
        if (this == obj)
                return true;
        if (obj == null)
                return false;
        if (getClass() != obj.getClass())
                return false;
        final Zi other = (Zi) obj;
        if (age != other.age)
                return false;
        if (name == null) {
                if (other.name != null)
                        return false;
        } else if (!name.equals(other.name))
                return false;
        return true;
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马