【转】JAVA中重写equals()方法为什么要重写hashcode()方法说明【一】
package com.fit;import java.util.HashMap;/** * 身份证类 * * @author ZYD * */public class Code {/** * 身份证号码,一旦确定就不能更改 */private final int id;public int getId() {return id;}/** * 通过构造方法确定身份证号码 * * @param id */public Code(int id) {this.id = id;}/** * 重写equals()方法 */public boolean equals(Object o) {// 如果地址一样,则两个对象相同if (this == o) {return true;}// 如果两个对象是同一类型,则比较其属性值是否都相同。如果都相同,则说明两个对象也相同;否则,说明这两个对象不相同。if (o instanceof Code) {Code co = (Code) o;boolean b = (co.id == this.id);return b;}return false;}/** * 重写toString()方法 */public String toString() {return "【身份证】:" + id;}/** * 测试 * @param args */public static void main(String[] args) { HashMap<Code, Person> map = new HashMap<Code, Person>(); Person p1 = new Person(new Code(10001),"张三"); Person p2 = new Person(new Code(10002),"李四"); map.put(p1.getCode(), p1); map.put(p2.getCode(), p2); System.out.println("HashMap 中存放的人员信息:\n"+map); //张三改名为张山,身份证号不变。 Person p3 = new Person(new Code(10001),"张山"); map.put(p3.getCode(), p3); System.out.println("张三改名为张山后 HashMap 中存放的人员信息:\n"+map); //查找身份证为10001 的人员信息 System.out.println("查找身份证为:10001 的人员信息:"+map.get(new Code(10001)));}}/** * 人类 * @author Administrator * */class Person {/** * 每一个成人都有一个身份证 */private Code code;/** * 姓名 */private String name;public Code getCode() {return code;}public void setCode(Code code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Person() {}public Person(Code code, String name) {this.code = code;this.name = name;}/** * 重写equals()方法 当两个人得身份证号相同以及姓名相同时,表示这两个人是同一个人。 */public boolean equals(Object o) {if (o == this) {return true;}if (o instanceof Person) {Person p = (Person) o;boolean b = this.code.equals(p.code) && this.name.equals(p.name);return b;}return false;}/** * 重写toString()方法 */public String toString() {return "【姓名】:" + name + " ";}}
?运行结果:
?
HashMap 中存放的人员信息:
{【身份证】:10002=【姓名】:李四? , 【身份证】:10001=【姓名】:张三? }
张三改名为张山后 HashMap 中存放的人员信息:
{【身份证】:10002=【姓名】:李四? , 【身份证】:10001=【姓名】:张三? , 【身份证】:10001=【姓名】:张山? }
查找身份证为:10001 的人员信息:null
?
从上面的结果可以看出:
?
package com.fit;import java.util.HashMap;/** * 身份证类 * * @author ZYD * */public class Code {/** * 身份证号码,一旦确定就不能更改 */private final int id;public int getId() {return id;}/** * 通过构造方法确定身份证号码 * * @param id */public Code(int id) {this.id = id;}/** * 重写equals()方法 */public boolean equals(Object o) {// 如果地址一样,则两个对象相同if (this == o) {return true;}// 如果两个对象是同一类型,则比较其属性值是否都相同。如果都相同,则说明两个对象也相同;否则,说明这两个对象不相同。if (o instanceof Code) {Code co = (Code) o;boolean b = (co.id == this.id);return b;}return false;}/** * 重写hashcode()方法,以身份证号码作为hash码。 * * @return */public int hashCode() {return id;}/** * 重写toString()方法 */public String toString() {return "【身份证】:" + id;}/** * 测试 * @param args */public static void main(String[] args) { HashMap<Code, Person> map = new HashMap<Code, Person>(); Person p1 = new Person(new Code(10001),"张三"); Person p2 = new Person(new Code(10002),"李四"); map.put(p1.getCode(), p1); map.put(p2.getCode(), p2); System.out.println("HashMap 中存放的人员信息:\n"+map); //张三改名为张山,身份证号不变。 Person p3 = new Person(new Code(10001),"张山"); map.put(p3.getCode(), p3); System.out.println("张三改名为张山后 HashMap 中存放的人员信息:\n"+map); //查找身份证为10001 的人员信息 System.out.println("查找身份证为:10001 的人员信息:"+map.get(new Code(10001)));}}/** * 人类 * @author Administrator * */class Person {/** * 每一个成人都有一个身份证 */private Code code;/** * 姓名 */private String name;public Code getCode() {return code;}public void setCode(Code code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Person() {}public Person(Code code, String name) {this.code = code;this.name = name;}/** * 重写equals()方法 当两个人得身份证号相同以及姓名相同时,表示这两个人是同一个人。 */public boolean equals(Object o) {if (o == this) {return true;}if (o instanceof Person) {Person p = (Person) o;boolean b = this.code.equals(p.code) && this.name.equals(p.name);return b;}return false;}/** * 重写toString()方法 */public String toString() {return "【姓名】:" + name + " ";}}
?
运行效果:
HashMap 中存放的人员信息:
{【身份证】:10001=【姓名】:张三? , 【身份证】:10002=【姓名】:李四? }
张三改名为张山后 HashMap 中存放的人员信息:
{【身份证】:10001=【姓名】:张山? , 【身份证】:10002=【姓名】:李四? }
查找身份证为:10001 的人员信息:【姓名】:张山?
?