当前位置: 代码迷 >> J2SE >> 又来烦劳前辈们了QAQ :关于覆写hashCode()方法
  详细解决方案

又来烦劳前辈们了QAQ :关于覆写hashCode()方法

热度:7802   发布时间:2013-02-25 00:00:00.0
又来麻烦前辈们了QAQ :关于覆写hashCode()方法

下面是用HashMap来装“人名和身份证号”的信息

Java code
-------------Code.java-----------package com.Code_Person;public class Code {    public final int id; //身份证号已确认,不能修改    public Code(int id)    { this.id=id; }        //覆写equals()    public boolean equals(Object anObject)    {        if(anObject instanceof Code)        {            return this.id==((Code)anObject).id;        }        return false;    }    public String toString()    {        return id+"\n";    }    //覆写hashCode()    public int hashCode()    {        return this.id;    }}--------------Person.java--------------package com.Code_Person;public class Person{    public String name;    public Code id;    public Person(String name,Code id)    {        this.name=name;        this.id=id;    }        //覆写equals()    public boolean equals(Object anObject)    {        if(anObject instanceof Person)        {            return this.id.equals(((Person) anObject).id);        }        return false;    }    public String toString()    {         return "姓名:"+name+" "+id;     }    //覆写hashCode()    public int hashCode()    {        return this.id.id;    }}----------------HashCode.java-----------------package com.Code_Person;import java.util.*;public class HashCode {    public static void main(String[] args)    {              /*第一部分用身份证号作key,用人名作value,显示信息              用p9去顶替掉p4,然后通过p9的身份证号找到p9的信息              按照要求覆写了Code.hashCode()来保证哈希值一样              这一部分成功了*/                      HashMap map=new HashMap();        Person p1=new Person("哈哈1号",new Code(111));        Person p2=new Person("哈哈2号",new Code(222));        Person p3=new Person("哈哈3号",new Code(333));        Person p4=new Person("哈哈4号",new Code(444));        map.put(p1.id,p1);        map.put(p2.id,p2);        map.put(p3.id,p3);        map.put(p4.id,p4);        System.out.println("map:"+"\n"+map);//显示        Person p9=new Person("豪豪4号",new Code(444));        map.put(p9.id,p9);        System.out.println("map:"+"\n"+map);//更新后再显示        System.out.println("身份证为444的人的信息:"+"\n"+map.get(new Code(444)));    //            System.out.println();        System.out.println();    //                           /*第二部分用人名作key,用身份证号作value,显示信息              用p10去顶替掉p8,然后想通过p10的人名找到p10的信息,              但问题(1)p10没有替换掉p8,显示的仍然是"哈哈8号",              而问题(2)在查找"豪豪8号"的时候,却仍然能找出信息,              为了hashCode一致,在Person类里面也做了覆写,不知道错在什么地方,              是不是哪里理解出错了,求前辈们指点              */        HashMap map2=new HashMap();        Person p5=new Person("哈哈5号",new Code(555));        Person p6=new Person("哈哈6号",new Code(666));        Person p7=new Person("哈哈7号",new Code(777));        Person p8=new Person("哈哈8号",new Code(888));        map2.put(p5,p5.id);        map2.put(p6,p6.id);        map2.put(p7,p7.id);        map2.put(p8,p8.id);        System.out.println("map2:"+"\n"+map2);//显示        Person p10=new Person("豪豪8号",new Code(888));        map2.put(p10, p10.id);        System.out.println("map2:"+"\n"+map2);//更新后显示,问题(1)        System.out.println("查找名叫豪豪8号的人信息:"+"\n"+map2.get(new Person("豪豪8号",new Code(888))));//问题(2)    }}


看网上总是很强调要覆写hashCode()才能来比较两个对象,但实际自己动手写却很晕不知道要抓住什么要点0.0 

运行结果
Java code
map:{222=姓名:哈哈2号 222, 444=姓名:哈哈4号 444, 111=姓名:哈哈1号 111, 333=姓名:哈哈3号 333}map:{222=姓名:哈哈2号 222, 444=姓名:豪豪4号 444, 111=姓名:哈哈1号 111, 333=姓名:哈哈3号 333}身份证为444的人的信息:姓名:豪豪4号 444map:{姓名:哈哈6号 666=666, 姓名:哈哈8号 888=888, 姓名:哈哈5号 555=555, 姓名:哈哈7号 777=777}map:{姓名:哈哈6号 666=666, 姓名:哈哈8号 888=888, 姓名:哈哈5号 555=555, 姓名:哈哈7号 777=777}查找名叫豪豪8号的人信息:888