日期:2014-05-20  浏览次数:20779 次

又来麻烦前辈们了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号 444



map:
{姓名:哈哈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