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