==与equals()方法

本文详细解析了Java中equals方法与==运算符的区别及其应用场景。重点介绍了equals方法的正确实现方式,包括自反性、对称性、传递性和一致性等原则,并提供了具体的重写示例。

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

关系运算符会返回一个boolean类型的值,它们计算的是操作数的值之间的关系。——《Java编程思想》

简言之,==就是用来比较值是否相等。而这个比较的规则又分为基本数据类型和非基本数据类型。

Java设计了8个基本数据类型:

浮点型:float(4byte)、double(8byte)

整型:byte(1byte)、short(2byte)、int(4byte)、long(8byte)

字符型:char(2byte)

布尔型:boolean(true/false)

针对基本数据类型,==直接比较数值是否相等;而针对非基本数据类型,==比较的是所引用对象在内存中的地址值,而非对象本身的内容值。(因为引用变量中存放的是其所引用的实际对象在内存中的地址值)

Java内存模型(参考


equals方法是基类Object中的方法,源码如下:

public boolean equals(Object obj) {
	return (this == obj);
    }
很显然,在Object中equals方法比较的是引用对象的地址值是否相等,即两个引用变量是否指向同一个对象。

然而在实际情况中我们需要通过对象的具体内容来判断对象是否相等,因此我们需要重写equals方法,以下是String类重写的equals方法源码:

public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }
总结:

重写equals方法的原则:

1、自反性:对于任何非空引用x,x.equals(x)应该返回true;

2、对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true;

3、传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true;

4、一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回相同的结果;

5、非空性:对于任意非空引用x,x.equals(null)应该返回false。

重写equals方法的步骤及要点:

1、判断实参是否为null;

2、使用==检查实参是否为指向已知对象的一个引用;

3、使用instanceof操作符检查实参是否为正确的类型;

4、把实参转换为正确的类型;

5、对于该类中每一个关键“域”,检查实参中的域与当前对象中对应的域值是否匹配。对于既不是float又不是double的基本类型的域,可以直接使用==关系运算符来比较;对于对象引用类型的域可以递归调用所引用对象的equals方法进行比较。对于float类型的域可以先使用Float.floatToIntBits()转换成int类型的值,然后再使用==运算符来比较int类型的值;对于double类型的域可以先使用Double.doubleToLongBits()转换成long类型的值,然后再使用==运算符来比较long类型的值;

6、当完成equals方法的重写之后,一定要检查其是否满足对称性、传递性、一致性。


注:equals方法无法作用于基本数据类型。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值