浅析Java的equals方法

本文深入探讨Java中对象等价性的概念,通过实例解释了使用`==`和`!=`操作符比较对象引用与内容的差异,并详细介绍了如何在自定义类中覆盖`equals()`方法以正确比较对象内容。此外,文章还特别分析了`String`类在比较时的独特表现,指出使用`equals()`方法的重要性。

关于对象等价性:

Integer n1 = new Integer(10);
Integer n2 = new Integer(10);
System.out.println(n1 == n2);
System.out.println(n1 != n2);	
输出:
false
true
原因:==和!= 比较的是对象的引用;而n1和n2虽然内容相同,但却是两个不同的对象的引用,所以对象的引用是不同的。


那么如果想比较两个对象的实际内容是否相同,必须使用所有对象都适用的特殊方法equals()
看下面例子:

Integer n1 = new Integer(10);
Integer n2 = new Integer(10);		
System.out.println(n1.equals(n2));
输出:
true


再看下面自定义类的例子:

class Test{
	int i;
}

Test t1 = new Test();
Test t2 = new Test();
System.out.println(t1.equals(t2));
输出:
false

结果又变成false了!!

原因:
看equals在Object中的源码:

    public boolean equals(Object obj) {
	return (this == obj);
    }

由equals源码可看出equals默认行为是比较引用,所以,除非在自己的新类中覆盖equals方法,否则就是一场灾难!

改写自定义类Test,覆盖equals方法:
class Test{
	int i;
	
    public boolean equals(Object obj) {
    	if (obj instanceof Test) {
    	    return this.i == ((Test)obj).i;
    	}
    	return false;
    }
}

在运行输出变为:true,得到我们想要的结果。


但我们需注意String的表现:

		String s1 = new String("123");
		String s2 = new String("123");
		String s3 = "456";
		String s4 = "456";
		System.out.println(s1.equals(s2));
		System.out.println(s3.equals(s4));
		System.out.println(s1 == s2);
		System.out.println(s3 == s4);

输出:
true
true
false
true


s3和s4定义的常量,指向的是同一块地址内存,所以对象的引用和内容均相同。
而s1和s2只是内容相同,对象引用是不同的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值