`
free9277
  • 浏览: 104570 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

重写Object中的equals方法

阅读更多

         在比较两个对象时可以使用==和equals()。==用于比较两个对象的引用地址是否相等,而equals()方法主要用于比较两个对象的内容是否相等。

    在Object中已定义了equals()方法,但是该方法直接采用==操作符实现,因此子类不重写该方法,那么子类对象在比较时将使用Object中定义的equals(),其结果与==操作符的比较结果是一样的。代码如下所示:

public class User {
    //用户名称
    private String userName;
    //用户密码
    private String password;
    
    public User(String userName, String password){
        this.userName = userName;
        this.password = password;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        User user = new User("xiaoming", "123");
        User user01 = new User("xiaoming", "123");
        System.out.println(user.equals(user01));
    }
}

        代码执行结果:false。

    可是我们使用equals()目的在于,比较类对象中的内容是否相等。这执行结果显然不是我们要的结果。因此为了方便比较类对象的内容是否相等,在定义类时一般都建议重写equals()方法。代码如下:

public class User {
    //用户名称
    private String userName;
    //用户密码
    private String password;
    
    public User(String userName, String password){
        this.userName = userName;
        this.password = password;
    }
    
    /**
     * 覆盖equals方法
     */
    public boolean equals(Object obj){
        if(obj == null){
            return false;
        }
        
        //如果是同一个对象返回true,反之返回false
        if(this == obj){
            return true;
        }
        
        //判断是否类型相同
        if(this.getClass() != obj.getClass()){
            return false;
        }
        
        User user = (User)obj;
        return userName.equals(user.userName) && password.equals(user.password);
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        User user = new User("xiaoming", "123");
        User user01 = new User("xiaoming", "123");
        System.out.println(user.equals(user01));
    }
}

           代码执行结果:true。

     我们还应该注意,Java语言对equals()的要求如下(来自Object的规范[JavaSE6]): 

     1. 对称性:如果x.equals(y)返回是"true",那么y.equals(x)也应该返回是"true"。

     2. 反射性:x.equals(x)必须返回是"true"。

     3. 类推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也应该返回是"true"。

     4. 一致性:如果x.equals(y)返回是"true",只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是"true"。

     5. 非空性,x.equals(null),永远返回是"false";x.equals(和x不同类型的对象)永远返回是"false"。

     以上这五点是重写equals()方法时,必须遵守的准则,如果违反会出现意想不到的结果,请大家一定要遵守。

     整理了这篇博客之后,对于重写Object的equals()方法,总觉得缺了点东西。后来又整理了一些知识点。感兴趣的朋友可以前往读一读续重写equals()方法。

http://free9277.iteye.com/blog/1832363

     重写了equals方法,别忘了也要冲洗hashCode哦。请看另一篇博客,重写hashCode()方法http://free9277.iteye.com/admin/blogs/1832378

     由于本人能力有限,博客中的内容难免会有错误。请各位朋友评判指出,别让我一错再错,哈。非常感谢!

5
1
分享到:
评论

相关推荐

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

    String重写了equals方法,引用指向同一个地址,一定返回true。并且如果String包含的字符串 完全相同,同样返回true. public boolean equals(Object anObject) { if (this == anObject) { return true; } /

    为什么在重写 equals方法的同时必须重写 hashcode方法

    Object 类是所有类的父类,其 equals 方法比较的是两个对象的引用指向的地址,hashcode 是一个本地方法,返回的是对象地址值。他们都是通过比较地址来比较对象是否相等的

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

    首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法

    javaee_tedu_day09.zip

    如果不是想使用object类,toString方法,可以重写此方法 equals方法 equals方法比较对象的是否相同 ==比较两个对象的内存地址 如果想表示对象的内容相同,返回true,则重写此方法 hashCode 返回一个hash code码,...

    Java的Object类讲解案例代码 equals()、hashCode()、finalize()、clone()、wait()

    通过该案例代码,你可以学习如何在自己的类中正确重写equals()、hashCode()、toString()等方法,提高代码质量和可读性。 经验丰富的Java开发者:即使你已经有一定的Java开发经验,仍然值得深入了解Object类的使用。...

    C#中Equals方法的常见误解

    而Object的派生类ValueTpye重写了Equals方法,它比较的是两个对象的逻辑等同性。 也就是说,在C#里,引用类型的默认Equals版本关注的是引用等同性,而值类型关注的是逻辑等同性。当然,这并不总能

    Java中hashCode和equals方法的正确使用

     hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。  使用hashCode()和equals()  hashCode()方法被用来获取给定对象的整数。这个整数被用来确定对象被...

    写一个类Student,包含三个属性学号id,姓名name和年龄age;要求覆盖基类Object中的ToString()方法和Equals()方法,使得直接输出Student对象时输出的是对象的id,name和age信息;并且当两个对象的学号相同时认为它们相等;

    要求覆盖基类Object中的ToString()方法和Equals()方法,使得直接输出Student对象时输出的是对象的id,name和age信息;并且当两个对象的学号相同时认为它们相等; 然后写一个主方法测试以上定义。

    探索equals()和hashCode()方法_动力节点Java学院整理

    equals():反映的是对象或变量具体...根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的;当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了。

    java中==和equals的区别

    前言 对于开发的程序员小伙伴,...equals:在Object中模式采用==比较,通常会重写 String对象重写了 equals,比较的是变量值 从上面我们笼统的来说明了一下两者的不同,那么接下来我们看看具体的区分 对象类型的比较

    学习Object类——为什么要重写equeals和hashcode方法

    个人学习终结成果:为什么要重新equals和hashCode方法?如何重写?站好马步需从j2se基础开始

    简单概括 ==跟equals的区别

    equals(父类是object,所以每个对象都会有equals):  ojbect的 (源代码的149行):出厂默认的话equals等价于 ==   string 类重写equals:比较的是每一个字符是否相等 hashCode(重写equals就一定要重写hashCode...

    java 面对对象编程.pdf.zip

    为什么重写 equals() 时必须重写 hashCode() 方法? String String、StringBuffer、StringBuilder 的区别? String 为什么是不可变的? 字符串拼接用“+” 还是 StringBuilder? String#equals() 和 Object#equals() ...

    ==和equals() 的比较

    ==和 equals ()都是用于...所以,通常override(重写/覆写)java.lang.0bject 类的中equals()方法 按照自己的需要,在equals()方法中定义对象相等的含义。 String.equals () 注意:当此方法被重写时,通常有必要重写ha

    Java 2023最新面试知识点总结.pdf

    equals是Object类的方法,Object对它的实现是比较内存地址,我们可以重写这个方法来自定义“相等”这个概念。比如类库中的String、Date等类就对这个方法进行了重写。综上,对于枚举类型和原始数据类型的相等性比较,...

    Java中的Object类详细介绍

    主要介绍了Java中的Object类详细介绍,本文讲解了Object类的作用、Object类的主要方法、Object类中不能被重写的方法、Object类的equals方法重写实例等内容,需要的朋友可以参考下

    安卓java读取网页源码-InterviewQuation:安卓面试的一些问题

    如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。 3)默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法, 而Object的equals方法主要用于判断对象的内存地址引用是不是同一个...

    面试String的特点及重要方法(二)

    上期呢我们对String的基本构造方法,源码进行了简单的总结,这期我们看看它比较更有魅力的地方,...可以看出,Object中的equals方法其实就是==,而String中重写了equals()方法把他修改成比较两个字符串是否相等。源码如

    CompactFormatter

    然后需要重写 Equals 方法。 public override bool Equals(object obj) { if (!obj.GetType().Equals(typeof(Customer))) { return false; } else { Customer answer = (Customer)obj; return (answer.ID ==...

    实验2 类和继承(4学时)

    掌握Object类中equals方法和toString方法的覆盖方法。 二、实验内容 1、设计一个名为figure的图形软件包(package)。包中包含三角形、矩形、圆三个类。要求:(1)每个类都要构造方法并为成员设置get和set方法;(2...

Global site tag (gtag.js) - Google Analytics