Java-Object类equals方法详解

1 equals

以前的定式思维:

==: ++返回的结果是boolean类型 基本数据类型:比较的是两边的值是否相同
引用数据类型:比较的是两边的地址值是否相同++

public boolean equals(Object obj)指示一些其他对象是否等于此。

通过观察发现,我们使用equals方法后,比较的结果和我们想的不太一样,我们要想知道这个方法是如何实现就应该去看源码,按住ctrl键+鼠标左键。

  • 观察源码发现:
        public boolean equals(Object obj) {
            return (this == obj);
        }
结论:

Object中equals方法底层默认调用的技术依旧是,而比较引用数据类型,比较的是地址值,而是s1和s2是两个不同的对象,所以地址值不是一样的,所以equals比较的结果是false。

解决办法:

更多的情况下,我们比较引用数据类型对象的时候,想要比较的是他们成员变量之间的值是否一样,而不是比较地址值。所以,在想要比较成员变量值是否一样的情况下,子类重写equals方法,也不需要自己手动给出,自动生成即可。

上代码:

package com.bigdat.java.day16;

import java.util.Objects;

class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = 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 "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
//在这里对 equals 方法进行了重写才使得 比较的只是两个对象所对应的地址值。才使得s1.equal(s2) 的值为true
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

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

/**
    public boolean equals(Object obj)指示一些其他的值是否等于此
    通过观察发现,我们使用equals后,比较的结果和我们想的不太一样
    我们通过查看码源后发现:
         public boolean equals(Object obj) {
         return (this == obj);
         }
      Object中equals方法底层默认调用的技术依旧是 ==, 而用== 比较引用的数据类型,
      比较的是地址值;s1和s2是两个不同的对象所以还是false
     更多的情况下,我们比较引用数据类型对象的时候,想要比较的是他们成员变量之间的值是否一样,
     而不是比较地址值。所以,在想要比较成员变量值是否一样的情况下,子类重写equals方法,也不需要自己手动给出,自动生成即可。
             ==: 返回的结果是boolean类型
             基本数据类型:比较的是两边的值是否相同
             引用数据类型:比较的是两边的地址值是否相同
 */
public class ObjectDemo1 {
    public static void main(String[] args) {
        Student s1 = new Student("二狗子",10);
        Student s2 = new Student("二狗子",10);
        System.out.println(s1.toString());
        Student  s3 =s1;
        System.out.println(s1 == s2);  //false "==" 比较的是地址值
        System.out.println(s1 == s3); //true 将s1的地址值赋值给s3.地址值一样
        System.out.println("=======================================");
        System.out.println(s1.equals(s2));

        System.out.println(s1.equals(s3));

    }
}
posted @   a-tao必须奥利给  阅读(393)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示