java中的equals方法

随便写一个类

package com.test1;
public class AB {
 int x = 10;
}

这个类里面什么也没有,除了一个default类型的属性x

然而当我们用eclipse实例化一个AB的对象aa,然后用aa去“点”一下的时候,会自动跳出许多方法,第一个就是equals()











也就是说,这些方法就像构造方法一样,是系统默认给每个类配置好的方法。

(实际上,任何一个类如果没有继承其他类都是默认继承Object类,而上述“默认”的方法就是在Object中实现,这里直接继承而来)

那么我来看看equals()方法。

在学习String的时候,老师特别说过,字符串的比较要用equals不要用“==”

因为equals比较的才是字符串的值,==比较的是地址!

		String a1 = "123";
		String b1 = "123";
		String a2 = new String("123");
		String b2 = new String("123");
		//“ == ”比较的是地址
		System.out.println("b1 == a1 ?  " + (b1==a1));//true
		System.out.println("b2 == a1 ?  " + (b2==a2));//false
		
		//而equals()比较的是内容
		System.out.println("b1 == a1 ?  " + b1.equals(a1));//true
		System.out.println("b2 == a1 ?  " + b2.equals(a2));//true

a1、a1、b1、b2四个对象的值都是一样的,但是a1和b1的地址相同(常量“123”被分配一次内存,地址相同)而a2、b2的地址不一样。

上面回顾了equals的作用,但是正如我们知道的,系统默认的构造方法是不干事的,那么每个类默认的equals()方法呢?

		AB aa = new AB();
		AB bb1 = new AB();
		AB bb2 = aa;
		System.out.println(bb1.equals(aa));//false
		System.out.println(bb2.equals(aa));//true

显然,很可惜,系统默认的equals()方法比较的是地址而不是值!

正如我们可以自己写构造方法其“屏蔽”系统的方法,我们也可以自己写equals()方法去“屏蔽”系统自带的equals()方法

eclipse提供自带的equals()方法的写法,只需在要写equals()方法的类界面按Alt+Shift+S快捷键(或者鼠标右键找到Sourse)

然后点击Generate hashCode() and equals()即可















equals()方法所需代码:

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + x;
	return result;
}

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	AB other = (AB) obj;
	if (x != other.x)
		return false;
	return true;
}
 

然后系统将自动生成equals()方法,自己写了这个方法后再去运行之前的代码就会发现结果不一样了

		//自己写了equals()方法之后
		AB aa = new AB();
		AB bb1 = new AB();
		AB bb2 = aa;
		System.out.println(bb1.equals(aa));//true
		System.out.println(bb2.equals(aa));//true


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值