Java中通过对equals重写比较两个对象

“==”和“equals”的区别:

==是一个比较运算符,在进行基本数据类型比较时,比较的是两个数据的值,在比较两个引用时,比较的是两个对象的内存地址;equals是Object类的一个方法,默认的实现使用的是==,可以在子类中通过对equals方法重写以达到自定义的比较目的。

注意:一般在重写equals方法时同时应该对hashcode方法重写,以保证两个对象的hash值一致,只有当对象的hash值一致时,系统才会判定这两个对象相等。

定义一个用户类:

public class User {
	String username; //用户名
	String password;//密码
}
定义两个用户:
User u1 = new User("admin","123");
User u2 = new User("admin","123");
他们的用户名和密码一样,但他们在内存中的地址是有区别的。
System.out.println(u1==u2);

输出结果为false,是因为“==”比较的是u1和u2的地址;

这时就需要用到equals方法来比较了

System.out.println(u1.equals(u2));

现在结果仍然为false

因为在Object中equals方法默认的是“==”;

所以要在Uesr类中要对equals方法进行重写,这就是Java中的多态。

public boolean equals(Object obj) {
	if (this == obj) {
		return true;
	} else {
		if (obj instanceof User) {
			User user = (User) obj;
			if (this.usermane.equals(user.getUsermane()) && this.password.equals(user.getPassword())) {
				return true;
			} else {
				return false;
		}
		} else {
			return false;
		}
	}
}

当重写equals方法后再比较u1和u2时 结果就会为true ,最后要重写hashcode方法使得两个相等对象的hash值一致。

总结:equals是对引用数据类型的比较。除去系统的引用类型,自己定义的引用类型在对两个数据比较时都需要对equals方法进行重写。






  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java,hashcode和equals方法是用于比较对象的重要方法。当我们需要比较两个对象是否相等时,就需要重写两个方法。 hashcode方法是用于获取对象的哈希码,它返回一个int类型的值。在重写hashcode方法时,我们需要保证相等的对象返回相同的哈希码,这样才能保证在使用哈希表等数据结构时,对象能够正确地被存储和查找。 equals方法是用于比较两个对象是否相等,它返回一个boolean类型的值。在重写equals方法时,我们需要保证相等的对象返回true,不相等的对象返回false。通常情况下,我们需要比较对象的属性值是否相等来判断两个对象是否相等。 需要注意的是,当我们重写equals方法时,也需要同时重写hashcode方法,否则在使用哈希表等数据结构时,可能会出现错误。 ### 回答2: hashcode和equals都属于Object类的方法,而在Java,许多数据结构都需要根据对象的hashcode和equals方法来判断某个对象在数据结构的位置和是否相等。因此,我们通常需要重写两个方法来满足自己的需求。 hashcode方法是返回某个对象的哈希码,它的作用是在HashMap、HashSet等数据结构对象进行分类。如果两个对象使用equals方法比较返回true,那么它们的hashcode方法必须返回相同的值,否则可能会造成数据结构失效导致数据无法取出。如果两个对象的hashcode值相等,但是使用equals方法比较返回false,这种情况称为哈希冲突。我们可以通过提高哈希冲突的概率来提高数据访问效率,例如优化哈希函数或者增大哈希表的容量。 equals方法是用来比较两个对象是否相等,我们可以根据对象的属性来自定义相等的规则。常见的重写方式是比较对象每个属性的值是否相等。需要注意的是,我们需要保证equals方法满足自反性、对称性、传递性和一致性等特征,否则可能导致数据结构错误或程序异常。 在Java,通常当我们自定义一个类时,需要重写两个方法以保证程序的正确性和程序运行效率。重写的方法要根据实际情况来选择,我们可以根据每个对象的属性来计算hashcode,也可以使用一些第三方框架来自动实现equals和hashcode方法,例如lombok、Apache Commons等。无论选择哪种方式,我们都要保证程序正确性和运行效率的平衡。 ### 回答3: Java的hashcode和equals方法是常用的对象方法,它们的作用是对对象进行操作和比较。在使用Java集合类时,如HashMap、HashSet、HashTable等都会用到hashcode和equals方法。 hashcode方法是Object类定义的方法,它返回对象的哈希码值。哈希码值是一个int类型的整数,它通过将该对象的内部地址转换成一个整数来计算。如果需要使用自定义的容器或自定义的集合类时,需要重写hashcode方法以提高容器性能。 equals方法也是Object类定义的方法,它用于比较两个对象是否相等。当需要判断两个对象是否相等时,就需要重写equals方法。通常情况下,equals方法比较的是对象的属性值,所以在实现equals方法时需要考虑对象的属性。 在重写equals方法时,需要注意以下几点: 1. 重写equals方法时,需要保证它遵循自反性、对称性、传递性和一致性这四个基本原则。 2. 对象相等的条件是对象的属性值相等,而不是内存地址相等。 3. 在比较对象属性时,需要避免空指针异常。 4. 当对象包含集合类型的属性时,在比较集合类型属性时需要递归比较每个元素。 当对hashcode和equals方法进行重写时,需要同时重写。如果两个对象equals方法返回true,那么它们的hashcode也应该相同。同时,如果两个对象的hashcode相同,那么它们不一定相等,需要通过equals方法再次比较。 总之,对hashcode和equals方法的重写可以提高Java容器的性能,也可以确保对象比较的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值