重写equals步骤时,记住,也要重写hashCode方法(当你使用集合HashMap,HashSet,Hashtable)

重写equals方法时,记住,也要重写hashCode方法(当你使用集合HashMap,HashSet,Hashtable)

看例子吧

package equalhashcode;

import java.util.*;

import bad.NewFileSize;

class Person {
	private String username;
	
	private int age;

	public Person() {
		
	}
	
	public Person(String username,int age) {
		this.username = username;
		this.age = age;
	}
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public boolean equals(Object obj) {
		Person person = (Person)obj;
		boolean flag = false;
		if(this.username.equals(person.getUsername())&&this.age==person.getAge()) {
			flag = true;
		}
		return flag;
	}
	
}

public class EqualDemo {
	public static void main(String[] args) {
		Map map = new HashMap<>();
		map.put(new Person("tree",25), "hello");
		System.out.println(map.get(new Person("tree",25)));
	}

}

返回结果是null,获取不到内容

而当我们重写了hashCode方法呢

@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return age*2;
	}

返回的结果就是hello了。


因为hashCOde有通用约定:

1、只要对象的equals方法所比较的信息没有修改,那么对这同一个对象调用多次,hashCode都必须始终如一的返回同一个整数。

2、如果两个对象equals比较相等,那么hashCode必须相等。

3、如果equals比较不相等,那么hashCode必须不相等。


至于hashCode怎么重写,首先你肯定要清楚equals方法所用到的字段,然后将这些字段完成到散列码的转换,至于如何操作,就看你自己如何定义了。

比如boolean,true->1,false->0等等