equals重写1


如何重写equals方法 //***********************来源于互联网*******************************

Equals 方法应该具备的条件:
obj.Equals(obj) 应该永远返回真
obj1.Equals(obj2) 和 obj2.Equals(obj1) 应该返回相同的结果
如果 obj1.Equals(obj2) 而 obj2.Equals(obj3) 那么 obj1.Equals(obj3) 应该也为真
别以为我的智商就小学水平,回去看看你的代码,这些都能做到吗?写一个具备如此条件的 Equals 方法不是件容易的事情!从实现角度说,一般来说分为两种情况:

一、给直接继承自 Object 基类的类型重写 Equals 方法

public class MyType {
private int x;
private string s;

public override bool Equals(object obj) {
// 如果 obj 是空的话,就直接返回假
// 因为当前对象不会是空,否则在还没有调用 Equals 方法之前就会先抛出空指针异常
if (obj == null) return false;

// 如果 obj 与当前对象不属于同一个类型,也直接返回假
// 显然两个不同类型的对象不可能相等
if (this.getType() != obj.getType()) return false;

// 这个强制类型转换是不会抛出异常的
// 因为你已经知道 obj 属于该类型
MyType o = (MyType)obj;

// 最后逐个比较他们的成员变量是否相等就可以了
if (this.x != o.x || this.s != o.s) return false;

return true;
}
}
二、给间接继承自 Object 基类的类型重写 Equals 方法

// MyType2 继承自 MyType,而不是直接继承自 Object
public class MyType2 : MyType {
private DateTime d;

public override bool Equals(object obj) {
// 如果基类认为这两个对象不相等
// 直接返回假
if (!base.Equals(obj)) return false;

// 两种实现方法的区别仅在于此,下面都是一样的
// 直接继承自 Object 的类型之所以没有上面这一段
// 是因为 Object 判断两个对象是否相等的逻辑非常简单
// 通常就是判断他们的引用是否相等。因为当前对象和 obj 很有可能是不同的引用
// 所以这种情况下,你的 Equals 方法绝大多数情况下都会返回假
// 如果 obj 是空的话,就直接返回假
// 因为当前对象不会是空,否则在还没有调用 Equals 方法之前就会先抛出空指针异常
if (obj == null) return false;

// 如果 obj 与当前对象不属于同一个类型,也直接返回假
// 显然两个不同类型的对象不可能相等
if (this.getType() != obj.getType()) return false;

// 这个强制类型转换是不会抛出异常的
// 因为你已经知道 obj 属于该类型
MyType o = (MyClass)obj;

// 最后逐个比较他们的成员变量是否相等就可以
if (this.d != o.d) return false;

return true;
}
}


equals小结:::::::::::::::::::::::::::::::::

l 操作符“==”用来比较两个操作元是否相等,这两个操作元既可以是基本类型,也可以是引用类型

2 在java.lang.Object类中定义了equals()方法,用来比较两个对象是否相等“==”两边都是引用类型的变量时候,这两个引用变量必须都引用同一个对象,结果才为true;“==”两边的变量被显式声明的类型必须是同种类型或有继承关系,即位于继承树的同一个继承分支上。


Dog dog=new Dog();
Creature creature=dog;
Animal animal=new cat();
System.out.println(dog==animal);//合法,false
System.out.println(dog==creature);//合法,true

Dog dog=new Dog();
Cat cat=new Cat();
System.out.println(dog==cat);//编译出错

JDk中有些类覆盖了Object类中的equals()方法,他们的比较规则为:如果两个对象的类型一致,并且内容一致,则返回true。
Integer int1=new Integer(1);
Integer int2=new Integer(1);
System.out.ptint(int1==int2);//false
System.out.ptint(int1.equals(int2));//true


仔细对比了equals方法和==在判断两个对象关系时原理及其相关的内存细节,整理了一下重写equals()方法的步骤:


l 首先应该测试两个引用是否指向同一个对象,如果是则直接返回true。这一步不是必须的,但可以提高比较时的性能,因为如果两个引用指向同一个对象,其equals测试肯定返回true,不再去比较任何内容
l 接下来应该测试传递进来的对象引用是否为null,如果是则直接返回false
l 然后测试传递进来的对象引用是否通过自己类型的instanceof测试,如果不通过则返回false,因为传递进来的对象一定是object型,也就是说指向的对象有可能是其他类型的,若是其他类型则没可比性的
l 将传进来的引用强制类型转换为自己的类型,测试相关的成员是否相等,成立则返回true,否则返回false
注意:重写equals方法时访问限制必须为public,因为object类中的该方法已经是public类型,重写方法的访问限制只能与原来相同或比原来宽;方法入口参数必须为object类型,不可以是其他的类型。

Class Student{
String name;
Int age;
Public Student(){}
Public Student(String name,int age){
This.name=name;
This.age=age;
}
Public Boolean equals(object o){
If(this==o){return true;}
If(o==null){return false;}
If(!(o instanceof Student)){return false;}
Student s=(Student)o;
If(this.name.equals(s.name)&&this.age==s.age)
{return true;}
Else {return false;}}}
//重写haseCode()
……….
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值