java_重写hashCode

重写hashCode
1.hashCode是什么?
​> hashCode是根据地址计算出来的十进制的数值,是地址的表现形式。
​ hashCode是根据地址算出来的一个数值 用于表示不同的对象在内存中的不同的空间
2.为什么需要重写hashCode
​ 在一些散列数据结构中 如果两个对象使用equals比较为true 那么这两个对象的hashCode必须相同
​ 注意:我们只是重写的hashCode 但并不会影响地址
String类型的hashCode已被JDK重写,和String类型的equals方法情况类似。


public class Person {

	private String name;
	private String idCard;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getIdCard() {
		return idCard;
	}
	public void setIdCard(String idCard) {
		this.idCard = idCard;
	}
	
	
	public Person() {
	}
	public Person(String name, String idCard) {
		this.name = name;
		this.idCard = idCard;
	}
	
	
	
	public boolean equals(Object obj) {
		// 自动提升 手动下降
		if(this == obj) {
			return true;
		}
		if(obj instanceof Person) {
			Person p  = (Person)obj;
			if((this.getName().equals(p.getName()))  && (this.getIdCard().equals(p.getIdCard()))) {
				return true;
			}
		}
		return false;
	}
	
	
	// 重写hashCode  
	// hashCode是什么?
	// hashCode是根据地址算出来的一个数值 用于表示不同的对象在内存中的不同的空间
	// 为什么需要重写hashCode
	// 在一些散列数据结构中  如果两个对象使用equals比较为true  那么这两个对象的hashCode必须相同
	// 注意:我们只是重写的hashCode  但并不会影响地址
	
	
	public  int hashCode() {
		// result表示结果 用于最终返回
		int result = 1;
		// 权重 31 是一个比较合适的数值 用于计算hashCode 
		// 我们的计算器是如何进行数学计算的?
		// 20 * 30 
		// 使用31是因为 任何数乘以31 等于这个数 左移5位 - 这个数本身
		//JDK中也用31
		// 左移几位 表示乘以2的几次方
		// 右移几位 表示除以2的几次方
		int prime = 31;
		result = result * prime + (this.getName() == null ? 0 :this.getName().hashCode());
		result = result * prime + (this.getIdCard() == null ? 0 : this.getIdCard().hashCode());
		return result;
	}
	
	
	public static void main(String[] args) {
		Person person1 = new Person("汪淼", "4512157875121245421");
		Person person2 = new Person("汪淼", "4512157875121245421");
		//重写后的equals()方法,比较内容,结果为true
		System.out.println(person1.equals(person2));
		System.out.println(person1.hashCode());
		System.out.println(person2.hashCode());
		//"=="比较的是地址,不同的对象地址不同,重写hashCode不影响地址,结果为false
		System.out.println(person1 == person2);
		
	}
}

结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值