tips: hashCode简要分析

  • HashCode的介绍

哈希码是按照某种规则生成的int类型的数值

哈希码并不是完全唯一的。

  • 规范1

若重写了某个类的equals方法,请一定重写hashCode方法,要保证”若两个对象相等,其hashCode一定相同”始终成立;

  • 规范2

若equals方法返回false,即两个对象不相等,并不要求这两个对象的hashCode得到不同的数;

  • 推论
两个对象相等,其HashCode一定相同;
两个对象不相等,其HashCode有可能相同;
HashCode相同的两个对象,不一定相等;
HashCode不相同的两个对象,一定不相等;


这个只是规范,违反并不会造成编译或运行时的错误,但会在存储一些集合中时造成潜在的bug,因为有些集合会首先根据hashCode来判断是否重复。

  • HashCode的意义

HashMap插入重复的key,HashSet插入重复的value,怎么来判断重复呢?他们判断两个对象是否相等的规则是:

1)首先判断两个对象的hashCode是否相等

如果不相等,认为两个对象也不相等,完毕

如果相等,转入2)

2)判断两个对象用equals运算是否相等

如果不相等,认为两个对象也不相等

如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)

class Person{
	private String name;
	private String sex;
	
	public Person(String name, String sex){
		if (name != null && sex != null) {
			this.name = name;
			this.sex = sex;
		}
	}
	
	public void print(){
		System.out.println(name + " " + sex);
	}
	
	public boolean equals(Object object){
		if (object instanceof Person) {
			Person person = (Person)object;
			if (this == person) {
				return true;
			}else if (person.getName() == this.getName() && person.getSex() == this.getSex()) {
				
				return true;
			}
		}
		return false;
	}
	
	public int hashCode(){
		int code = 36;
		code = 17*code + name.hashCode();
		code = 17*code + sex.hashCode();
		return code;
		
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
	
}

public class TestEquals {

	public static void main(String[] args) {
		Person p1 = new Person("张三", "男");
		Person p2 = new Person("张三", "男");
		Person p3 = new Person("李四", "男");
		System.out.println(p1.equals(p2));
		System.out.println(p1.equals(p3));
		System.out.println(p1.hashCode());
		System.out.println(p2.hashCode());
		System.out.println(p3.hashCode());
	}

}

输出结果:

true

false

13213524

13213524

14355448

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值