`

hashCode与equals

    博客分类:
  • java
 
阅读更多

 

 

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

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics