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!