ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

重写Object类的equals方法与Objects类的equals方法Object类&Objects类总结

2022-07-05 14:32:14  阅读:116  来源: 互联网

标签:return name age Object equals Person Objects public


重写Object类的equals方法

package Object_demo01;

import java.util.Objects;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /*
    直接打印对象的地址没有意义,需要重写Object类的toString方法
    打印对象的属性(name age)
     */
    /*
    0bject类的equals方法认比较的是两个对象的地址值,没有意义所以我们高要重与equaLs方法,比较两个对象的属性值(name , age)
对象的属性值一样好,返回true;否见版回false
问题:
障含着一个多态
0bject obj-p2_- newe Person(古力娜扎"",18);多玉弊端:无去使用子类特有的内容(属性,方法
解决:可以使用向下转型(强转)把Object类型转换为Person
     */

//    @Override
//    public boolean equals(Object obj) {
//        if (obj==this){
//            return true;
//        }
//        ////增加一个判断,传递的参数obj是nul,直接返回false,提高程序的效率
//        if (obj==null){
//            return false;
//        }
//        if (obj instanceof  Person){
//        Person p  =(Person)obj;
//        boolean b = this.name.equals(p.name) && this.age==p.age;
//        return b;
//        }
//        return false;
//
//    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 

package Object_demo01;

import java.util.Random;

/*
Person类默认继承了object类,所以可以使用object类的equals方法boolean equals(object obj)指示其他某个对象是否与此对象“相等”。object类equals方法的源码:
public boolean equals(Object obj) i
return (this -= obj);
参数:
object obj:可以传递任意的对象方法体:
==:比较运算符,返回的就是—个布尔值true,false基本数据类型:比较的是值
引用数据类型:比较的是两个对象的地址值
this是谁?那个对象调用的万法,方法中的this就是那个对象; p1调用的equals方法,所以this就是P1obj是谁?传递过来的参数p2
 */
public class Demo01equals {
    public static void main(String[] args) {

        Person p1 = new Person("射手",35);
        Person p2 = new Person("射手",35);
//        p1=p2;

        System.out.println("p1"+p1);
        System.out.println("p1"+p2);


        Random random = new Random();

        boolean equals1 = p1.equals(random);
        boolean equals2 = p1.equals(null);
        boolean equals3= p1.equals(p2);
        System.out.println(equals1);
        System.out.println(equals2);
        System.out.println(equals3);
    }
    //equals比较的是地址值
}

 

Objects类的equals方法

在刚才IDEA自动重写equals代码中,使用到了java.util.objects类,那么这个类是什么呢?
在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。
在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题。方法如下:
public static boolean equals(object a,object b):判断两个对象是否相等。我们可以查看一下源码,学习一下:

package Object_demo01;

import java.util.Objects;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /*
    直接打印对象的地址没有意义,需要重写Object类的toString方法
    打印对象的属性(name age)
     */
    /*
    0bject类的equals方法认比较的是两个对象的地址值,没有意义所以我们高要重与equaLs方法,比较两个对象的属性值(name , age)
对象的属性值一样好,返回true;否见版回false
问题:
障含着一个多态
0bject obj-p2_- newe Person(古力娜扎"",18);多玉弊端:无去使用子类特有的内容(属性,方法
解决:可以使用向下转型(强转)把Object类型转换为Person
     */

//    @Override
//    public boolean equals(Object obj) {
//        if (obj==this){
//            return true;
//        }
//        ////增加一个判断,传递的参数obj是nul,直接返回false,提高程序的效率
//        if (obj==null){
//            return false;
//        }
//        if (obj instanceof  Person){
//        Person p  =(Person)obj;
//        boolean b = this.name.equals(p.name) && this.age==p.age;
//        return b;
//        }
//        return false;
//
//    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package Object_demo01;

import java.util.Objects;

public class Demo01_Objects {
    public static void main(String[] args) {

        String  s3 = null;
        String  s2 = "aaa";

//        boolean b = s3.equals(s1); // NuLLPointerException null是不能调用方法的,会抛出空指针异常
//        System.out.println(b);
        //0bjects类的equaLs方法:对两个对象进行比较,防止空指针异常
        // public static boolean equals(Object a, Object b) {
        //        return (a == b) || (a != null && a.equals(b));
        //    }

        boolean b2 = Objects.equals(s2,s3);
        System.out.println(b2);
    }
}

总结:

一.Object类1.object类介绍
Object类是所有类的父类。一个类都会直接或者间接的继承自该类该类中提供了一些非常常用的方法!
2.toString()方法
A∶作用:打印对象的信息
B:重写前:打印的是包名类名@地址值C∶重写后∶打印的是对象中的属性值3.equals()方法
A:作用:比较两个对象的
B:重写前:比较的是对象的地址值C︰重写后∶比较的是对象中的属性值
二、objects类
1.equals()方法
比较两个对象是否相同,但是加了一些健壮性的判断!

 

标签:return,name,age,Object,equals,Person,Objects,public
来源: https://www.cnblogs.com/x3449/p/16446309.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有