黑马程序员技术交流社区

标题: [已解决]HashMap问题 [打印本页]

作者: 黄克帅    时间: 2012-6-2 17:05
标题: [已解决]HashMap问题
本帖最后由 黄克帅 于 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被覆盖了

                }
               
        }

}
作者: 丰亚彬    时间: 2012-6-2 17:17
视频上老师讲过了,你自定义的类如果存放到HashMap中要根据键的类型重写hashCode方法和equals方法,这样才能进行对比的
作者: 黑马—陈磊    时间: 2012-6-2 17:20
你可以做个这样的小测试:
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的也不会被覆盖。
作者: 胡团乐    时间: 2012-6-2 18:46
在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;
}





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