`

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()
……….
分享到:
评论

相关推荐

    重写equals方法

    "equals 方法重写详解" 在 Java 中,equals 方法是一个非常重要的方法,它用于判断两个对象是否相等,而不是判断两个对象的引用是否相同。在 Object 基类中,equals 方法的实现是使用“==”操作符来比较对象的引用...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    如果你只重写了 `equals()` 而不重写 `hashCode()`,可能会导致无法正确地将对象添加到集合或从集合中查找对象。例如,在HashMap中,如果两个键通过 `equals()` 方法判断为相等,但它们的哈希码不同,那么HashMap会...

    重写toString和equals方法

    Java 对象的toString和equals方法重写 在 Java 中,每个对象都继承自 Object 类,而 Object 类中定义了两个重要的方法:toString() 和 equals()。这两个方法都是非常重要的,它们分别用于对象的字符串表示和对象...

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    equals方法的重写.docx

    ### equals方法重写知识点解析 #### 一、equals方法简介 `equals`方法是Java语言中Object类的一个重要成员方法,其默认实现是比较两个对象的内存地址是否相同(即是否为同一个对象)。为了使对象之间能够基于内容...

    C# Equals 和 GetHashCode 方法重写

    ### C# Equals 和 GetHashCode 方法重写 在C#编程中,`Equals` 和 `GetHashCode` 方法是非常重要的成员方法,它们对于确保对象的正确比较以及高效地存储和检索对象至关重要。这两个方法通常需要在自定义类中进行...

    Java_重写equals()和hashCode()

    1. **自反性**:对于任何非null的引用值x,x.equals(x)应该返回true。 2. **对称性**:如果x.equals(y)返回true,那么y.equals(x)也应该返回true。 3. **传递性**:如果x.equals(y)返回true,且y.equals(z)也返回...

    winform 重写Equals源码

    1. **使用`override`关键字**:在自定义类中,使用`override`关键字重写基类`Object`的`Equals`方法。 ```csharp public override bool Equals(object obj) ``` 2. **类型检查**:在`Equals`方法内部,首先检查...

    equals与hashCode在实际开发中的重写写法

    在使用 `HashSet`、`HashMap` 等数据结构时,如果重写了 `equals()` 方法但没有重写 `hashCode()` 方法,可能会导致预期的行为不一致。因为这些数据结构依赖于 `hashCode()` 来确定对象的存储位置,而 `equals()` 来...

    关于重写equals,hashcode以及compareTo方法!

    关于重写equals、hashcode以及compareTo方法! equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,...

    重写hashCode()和equals()方法详细介绍

    1. **自反性**:对于任何非null的引用值x,x.equals(x)应该返回true。 2. **对称性**:如果x.equals(y)返回true,那么y.equals(x)也应该返回true。 3. **传递性**:如果x.equals(y)和y.equals(z)都为true,那么x....

    方法重写equals和多态

    在Java编程语言中,"方法重写equals"和"多态"是两个核心概念,尤其对于面向对象的设计和实现至关重要。下面将详细解释这两个概念及其相互关系。 **方法重写equals()** 在Java中,`equals()`方法是Object类的一个...

    why在重写equals时还必须重写hashcode方法分享

    1. **一致性**:根据 Java 的 `Object` 类文档,如果两个对象通过 `equals()` 方法比较为相等,那么它们的 `hashCode()` 方法应该返回相同的值。这是为了确保当对象被添加到哈希结构(如 `HashSet` 或 `HashMap`)中...

    浅谈java 重写equals方法的种种坑

    关于 Java 中重写 equals 方法的种种坑 Java 中的 equals 方法是一种用于比较对象是否相等的方法,它是 Object 类中的一个方法。然而,重写 equals 方法并不是一件简单的事情,因为它需要遵守一些约定,否则可能会...

    java中为何重写equals时必须重写hashCode方法详解

    1. **一致性**:一旦对象被创建并赋予了特定的值,其 `equals()` 和 `hashCode()` 方法的结果就应该保持不变,即使在程序的不同执行期间也是如此。这意味着如果你重写了 `equals()` 使得两个对象相等,那么它们的 `...

    为什么重写equals方法,还必须要重写hashcode方法

    为什么重写equals方法,还必须要重写hashcode方法

    Java中equals()方法重写实现代码

    Java中equals()方法重写实现代码详解 Java中equals()方法是Object类中定义的,作为所有类的父类,任何类都隐含地继承了该方法。 equals()方法用于判断两个对象的内容是否相同,如果没有重写该方法的类,需要重写该...

    面试官瞬间就饱了,重写equals函数,需要重写hashCode函数吗?

    如果我们只重写了 `equals()`,但没重写 `hashCode()`,当将这些对象用作 `HashMap` 的键时,可能会遇到问题。例如,两个内容相同但 `hashCode()` 不同的 `String` 对象会被存储在哈希表的不同位置,导致预期的覆盖...

    java中重写equals()方法的同时要重写hashcode()方法(详解)

    Java 中重写 equals() 方法的同时要重写 hashCode() 方法的重要性 在 Java 中,equals() 方法和 hashCode() 方法是两个紧密相关的方法,它们都是用于比较和标识对象的方法。equals() 方法用于比较两个对象的值是否...

    java中重写equals和重写hashCode()

    总结来说,当重写 `equals()` 方法以比较对象内容时,也需要重写 `hashCode()` 方法以保持对象平等性和哈希码的一致性。这样可以确保散列数据结构能够正确处理相等的对象,防止出现不应有的重复元素。对于 Java ...

Global site tag (gtag.js) - Google Analytics