Java对象判等,Object类equals()方法

Java中对象的判等,大家会想到equals()方法

equals

equals()方法的定义:用于测试某个对象是否和另一个对象相等。在Object类(所有类的祖先)中的实现是判断两个对象是否指向同一块内存空间。

很显然,这种方法就好比“==”的作用。在很多时候不能满足我们的要求,如clone出来的对象和原来的对象,就是两个对象指向不同的两块空间,而空间里的内容相等,,很多时候我们需要的是这种相等。。

clone()也是Object的一种方法 ,这里只做简单介绍:

Person p1 = new Person();
p1.setName("SkySong");
Person p2 = (Person)p1.clone();

System.out.printIn(p2.getName());//SkySong
System.out.printIn(p1.equals(p2));//false
System.out.printIn(p1 == p2);//false

想要使用clone()方法要在类中实现 Cloneable 接口,并重写clone()方法

public class Person implements Cloneable{
	@Override
	protected Object clone() throws CloneNotSupportedException{
		return super.clone();
	}

}

当然还有一点要注意,当Person类中的成员是别的类对象时,此时的clone会出一点小问题,这里涉及到深度克隆了,有点跑题了,不会的自行查阅,咱接着说判等!

咳咳…
很显然,原始的equals()方法不能很好的解决问题,,那,我们就重写它!

public boolean equals(Object otherObject){
	//先看看是不是指向同一块地方
	if(this == otherObject){
		return true;
	}
	//若干参数为空(指向null),必须返回false,,Java语言的规定
	if(otherObject == null)
		return false;
	//类不同,对象肯定不同
	if(getClass()!=otherObject.getClass())
		return false;
	//走到这一步,差不多就可以真正地判断一下了
	//这里用之前的Person类为例,判断两个Person对象是否相等
	Person p = (Person)otherObject;
	//判断所有字段是否相等,这里的Person只有name
	if(this.getName().equals(p.getName())){
		return true;
	}	
}

但这样会有一个比较致命的缺点:每个不同的实体类的判等方法( equals() 方法)都需要重写才行,这缺点就和静态代理的缺点一样,但可以用动态代理来解决,那这儿是不是可以考虑来个动态判等。

到这就差不多了,,顺便在提一下常量的判等(String就是典型的final对象)
拿String举例,一旦赋值就不可改变。

String s1 = "sky";
String s2 = "sky";
//显然s1 和 s2 指向同一块地方(当前类的常量池里的某个地方)


String ss1 = new String("sky");
String ss2 = new String("sky");
//显然 ss1 和 ss2 是两个不同的对象,虽然他们的值相等,但
//都存储在他们各自的常量池里(两个对象开辟两个空间)
//所以 ss1 == ss2 结果为 false

That’s all,.Thank you!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值