哈希码

本文详细阐述了哈希码在Java中的作用及其在Hibernate框架中的应用,包括如何通过重写equals和hashCode方法来确保数据的一致性和高效性。通过实例解析,展示了如何利用哈希码特性在数据库操作中避免重复数据插入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。


一、简介

1、什么是哈希码(HashCode)

Java中,哈希码代表对象的特征。

例如:

String str1 = “aa”, str1.hashCode= 3104

String str2 = “bb”, str2.hashCode= 3106

String str3 = “aa”, str3.hashCode= 3104

根据HashCode由此可得出str1!=str2,str1==str3


2、下面给出几个常用的哈希码的算法。

(1)Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。

(2)String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。

(3)Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。


二、方法应用

1、equals方法在hibernate中的应用。

equals方法是默认的判断2个对象是否相等的方法,在Object类里有实现,判断的是2个对象的内存地址。在hibernate中,不允许存在同类对象中有2个一样的实例。hibernate通过equals方法做判断。

例如:

User u1 = new User(“张三”);

User u2 = new User(“李四”);

User u3 = new User(“张三”);

按照项目需求,用户只要名字相同,就表示同一个用户,所以我们认为,u1u3是同一个人,同一个对象。但是因为u1,u2,u3三者的内存地址都各不相同,所以hibernate会认为这是3个不同的对象。这与我们假设的出了矛盾。因此,我们将覆盖Object类中的equals方法。

public class User{
	private String userName;
	//…getter ,setter方法省略
	//覆盖Object里的equals方法
	public boolean equals(Object arg0){
		if (!(arg0 instanceof User)){
		return false;
	}
	User user = (User)arg0;
	//如果名字相同,则表示属于同一个对象。
	if(user.getName().equals(this.getName)){
		return true;
	}else{
		return false; 
	}
}

这样hibernate在插入数据的时候,如果传过来一个叫张三的用户,hibernate会先判断有没有叫张三的用户,如果没有,就允许插入,如果有,就不允许插入。这样做可以保证数据的高度一致性,不同的项目有不同的需求,所以要根据自己的需求来覆盖equals方法。


三、判断方法

1、为什么不按主键来判断

因为主键是在插入数据进数据库之后才产生的,在一个对象还没有被持久化的时候,它是没有主键的,所以hibernate无法根据主键判断它是否有相同数据。


四、两者关系

1、equalsHashCode的关系

hibernate中,它认为2个对象只要equals返回true,那么hashCode一定相等。但是实际情况呢?

User u1 = new User(“张三”);

User u2 = new User(“张三”);

由于我们重写了Userequals方法,所以u1.equals(u2);返回true但是,User并没有重写hashCode方法,它用的是Object类的hashCode方法,所以 u1.hashCode = 31050006 u2.hashCode =31587890 两者的hashCode并不相等。违背了hibernate的原则由此hibernate会产生错误判断,又以为它们不是同一个对象,因此我们还得重写UserhashCode方法。如何重写hashCode方法呢?


五、软道语录

1、哈希码

哈希码就是对象的身份证。


六、数字重写

1、HashCode的重写

如上面所讲,哈希码要完成这么一件事,首先要保证如果equlas出来的结果相等,那么hashCode也相等。像上面的u1u2,由于名字都是张三,所以应该返回相同的hashCode。所以我们可以想一个办法。让User的哈希码返回User里面name字段的哈希码,这样就保证,名字相同的人,不但equlas方法相同,而且hashCode相等。那么User类就变成:

public class User{
	private String userName;
	//覆盖Object里的equals方法

	public boolean equals(Object arg0){
		if(!(arg0 instanceof User)){
			return false;
		}

		User user = (User)arg0;
		
		//如果名字相同,则表示属于同一个对象。
		if (user.getName().equals(this.getName)){
			return true;
		}else{
			return false;
		}
	}

	//覆盖Object里的hashCode方法
	public int hashCode() {
		return name.hashCode();//返回名字的哈希码。
	}

}
这样可以保证hibernate根据我们自己的需求来判断重复对象

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值