hashcode方法返回该对象的哈希码值,通常用在一些hash集合的处理中,用来存放散列对象。
几个原则:
equals相等 hashcode必须相等
在集合中对象的对比中,hashcode不等则两个对象一定不等
重写equals 则必须重写hashcode,以保证
对象放在HashTable中的时候,首先会查找对象的Hashcode,如果地址中有相应的数据,则用equals来判断对象是否相等,
如果相等则不保存对象,如果不同
代码:
package com.jusfoun.dandelion.dw;
import java.util.HashSet;
import java.util.Set;
public class Person {
private int age;
private int sex; // 0:男,1:女
private String name;
private final int PRIME = 37;
Person(int age, int sex, String name) {
this.age = age;
this.sex = sex;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPRIME() {
return PRIME;
}
/** 省略getter、setter方法 **/
@Override
public int hashCode() {
System.out.println("调用hashCode方法...........");
int hashResult = 1;
hashResult = (hashResult + Integer.valueOf(age).hashCode() + Integer.valueOf(sex).hashCode()) * PRIME;
hashResult = PRIME * hashResult + ((name == null) ? 0 : name.hashCode());
System.out.println("name:" + name + " hashCode:" + hashResult);
return hashResult;
}
/** * 重写hashCode() */
public boolean equals(Object obj) {
System.out.println("调用equals方法...........");
if (obj == null) {
return false;
}
if (obj.getClass() != this.getClass()) {
return false;
}
if (this == obj) {
return true;
}
Person person = (Person) obj;
if (person.getAge() != person.getAge() || getSex() != person.getSex()) {
return false;
}
if (getName() != null) {
if (!getName().equals(person.getName())) {
return false;
}
} else if (person != null) {
return false;
}
return true;
}
public static void main(String[] args) {
Set<Person> set = new HashSet<Person>();
Person p1 = new Person(11, 1, "张三");
Person p2 = new Person(12, 1, "李四");
Person p3 = new Person(11, 1, "张三");
Person p4 = new Person(11, 1, "李四"); //只验证p1、p3
System.out.println("p1 == p3? :" + (p1 == p3));
System.out.println("p1.equals(p3)?:"+p1.equals(p3));
System.out.println("-----------------------分割线--------------------------");
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
System.out.println("set.size()="+set.size());
}
}
返回值如下,每次添加对象都会调用hashCode方法,如果code相同则调用equals相同则不保存:
p1 == p3? :false
调用equals方法...........
p1.equals(p3)?:true
-----------------------分割线--------------------------
调用hashCode方法...........
name:张三 hashCode:792686
调用hashCode方法...........
name:李四 hashCode:861227
调用hashCode方法...........
name:张三 hashCode:792686
调用equals方法...........
调用hashCode方法...........
name:李四 hashCode:859858
set.size()=3