首页 > 编程语言 >java——API—— Object类——equals方法

java——API—— Object类——equals方法

时间:2022-11-16 22:58:52浏览次数:35  
标签:java name age Object equals Person API obj

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

equals方法的概述与用法

方法摘要

  • public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
    调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。

默认地址比较

如果没有覆盖重写equals方法,那么Object类中默认进行==运算符的对象地址比较,只要不是同一个对象,结果必然为false。


Person类默认继承了Object类,所以可以使用Object类的equals方法
boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。

  • equals方法源码:
                public boolean equals(Object obj) {
                    return (this == obj);
                }

解释:
Object obj:可以传递任意的对象

  • == 比较运算符,返回的是一个布尔值 true false
  • 基本数据类型:比较的是值
  • 引用数据类型:比价的是两个对象的地址值
    this是谁?那个对象调用的方法,方法中的this就是那个对象;p1调用的equals方法所以this就是p1
    obj是谁?传递过来的参数p2
    this==obj -->p1==p2

Person类

package com.itheima.demo01.Object;

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)
     */
    /*@Override
    public String toString() {
       //return "abc";
       return "Person{name="+name+" ,age="+age+"}";
    }*/
    /*@Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }*/

    /*
        Object类的equals方法,默认比较的是两个对象的地址值,没有意义
        所以我们要重写equals方法,比较两个对象的属性(name,age)
        问题:
            隐含着一个多态
            多态的弊端:无法使用子类特有的内容(属性和方法)
            Object obj = p2 = new Person("古力娜扎",19);
            解决:可以使用向下转型(强转)把obj类型转换为Person
     */
    /*@Override
    public boolean equals(Object obj) {
        //增加一个判断,传递的参数obj如果是this本身,直接返回true,提高程序的效率
        if(obj==this){
            return true;
        }

        //增加一个判断,传递的参数obj如果是null,直接返回false,提高程序的效率
        if(obj==null){
            return false;
        }

        //增加一个判断,防止类型转换一次ClassCastException
        if(obj instanceof Person){
            //使用向下转型,把obj转换为Person类型
            Person p = (Person)obj;
            //比较两个对象的属性,一个对象是this(p1),一个对象是p(obj->p2)
            boolean b = this.name.equals(p.name) && this.age==p.age;
            return b;
        }
        //不是Person类型直接返回false
        return false;
    }*/
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        //getClass() != o.getClass() 使用反射技术,判断o是否是Person类型  等效于 obj instanceof Person
        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;
    }
}


测试equals方法

package com.itheima.demo01.Object;

import java.util.ArrayList;

public class Demo02Equals {
    public static void main(String[] args) {
       
        Person p1 = new Person("迪丽热巴",18);
        //Person p2 = new Person("古力娜扎",19);
        Person p2 = new Person("迪丽热巴",18);
        System.out.println("p1:"+p1);//p1:com.itheima.demo01.Object.Person@58ceff1
        System.out.println("p2:"+p2);//p2:com.itheima.demo01.Object.Person@7c30a502

        //p1=p2;//把p2的地址值赋值给p1
        ArrayList<String> list = new ArrayList<>();

        boolean b = p1.equals(p1);
        System.out.println(b);
    }
}
 

 

标签:java,name,age,Object,equals,Person,API,obj
From: https://www.cnblogs.com/xiaobaibailongma/p/16897838.html

相关文章

  • java——API—— Object类——toString方法
    Object类的概述概述java.lang.Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。如果一个......
  • java——API——Math类
                                                         ......
  • Javascript(笔记40) - ES6特性 - Map
    Javascript(笔记40)-ES6特性-MapMap ES6 提供了Map数据结构。它类似于对象,也是键值对集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map也实......
  • #yyds干货盘点#聊聊javascript——call、applay、bind
    Callcall()方法使用一个指定的this值和单独给出的一个或多个参数来调用一个函数。​使用方法:letbar={name:'johnny'}functionfoo(){console.log(this.name......
  • Java学习——11.16
    今天把狂神的Java基础看完了,但Java基础没完全看完。从网上看的狂神的评价都不好,就很无语!!!,对此还想了很久。也是自己学完,感觉没啥用(和鹏哥一个天上一个地下),太杂太乱了,明......
  • java——API——String类
    字符串概述和特点:               字符串的构造方法和直接创建:                      ......
  • Java并发之回顾Thread和runnable
    jdk文档的描述ThreadAthreadisathreadofexecutioninaprogram.TheJavaVirtualMachineallowsanapplicationtohavemultiplethreadsofexecutionrunn......
  • JavaScript中点击按钮弹出新的浏览器窗口
    */*Copyright(c)2016,烟台大学计算机与控制工程学院*Allrightsreserved.*文件名:text.js*作者:常轩*微信公众号:Worldhello*完成日期:2016年10月226日*版本号:V......
  • Java练习1
    */*Copyright(c)2016,烟台大学计算机与控制工程学院*Allrightsreserved.*文件名:text.cpp*作者:常轩*微信公众号:Worldhello*完成日期:2016年9月20日*版本号:V1......
  • Javascript(笔记39) - ES6特性 - 集合Set
    SETES6 提供了新的数据结构set(集合)。集合类似于数组,但成员的值都是唯一的,集合实现iterator 接口,所以可以使用“扩展运算符”和“for...of”进行遍历,集合的属性和方法......