Java Object equal重写

Object中的toString方法

Object中的equals方法

小结:

1、如果直接输出对象名不想输出地址值,重写toString方法

2、如果想比较两个对象的内容,就重写一下equals方法

3、怎么重写:alt+insert->选toString或者equals and hashcode ->啥也不要管->一路下一步就可以了。

Object中的equals

js 复制代码
1、概述:比较两个对象的地址值是否相等

public boolean equals(Object obj) {
  return (this == obj);
}

== 针对于基本数据类型来说,比较的是值
== 针对于引用数据类型来说,比较的是地址值
java 复制代码
public class Test02 {
  public static void main(String[] args) {
    Person p1 = new Person("金莲", 26);
    Person p2 = new Person("金莲", 26);
    System.out.println(p1 == p2); // false
    System.out.println(p1.equals(p2)); // false
    
    System.out.println("======")
    
    String s1 = new String("abc");
    String s2 = new String("abc");
    System.out.println(s1==s2); // false
    System.out.println(s1.equals(s2)); // true equal比较的不是定值,而是内容
  }
}

string当中equals

重写之后就不再比较地址值了。

2、注意: a、如果没有重写Object中的equals方法,那么就会调用Object中的equals方法,比较对象的地址值。 b、如果重写了Object中的equals方法,那么就会调用重写后的equals方法,应该比较对象的内容。

java 复制代码
public class Person {
    
    /*
      问题1:obj直接调用name和age调用不了,因为Object接收了Person类型的对象属于多态,多态前提下不能直接调用子类特有内容
      
      解决问题1:向下转型
      
    */
    @Override
    public boolean equals(Object obj){
      Person p = (Person) obj;
      return this.name.equals(p.name) && this.age==p.age;
    }
}

因为比较的只是name和age的值,因为p1和p2里面内部的值是不是一样的。是,那就完事了。 那就是相等。

java 复制代码
ArrayList<String> list = new ArrayList<>();
System.out.println(p1.equals(list))

现在object是不是接了一个list ArrayList。

问题2:如果传递的不是Person类型,就会出现类型转换异常。

解决问题2:先判断类型,如果是Person类型,再强转Person

问题3:如果传递null呢?就不用判断类型了,直接给false

问题4:如果传递自己呢?就不用判断非空也不用判断null了,直接给true。

java 复制代码
System.out.println(p1.equals(null));
java 复制代码
public boolean equals(Object obj) {
  if (this==obj){
    return true;
  }

  if (obj == null) {
    return false;
  }

  if (obj instanceof Person) {
    Person p = (Person) obj;
    return this.name.equals(p.name) && this.age==p.age;
  }
  return false;
}

再引出快速生成。

重写,可以直接用人家写的equals() and hashCode()

相关推荐
Daybreak1 小时前
Elasticsearch 里的索引和 Mapping,到底是什么关系?
后端
Lee川1 小时前
Prisma 实战指南:像搭积木一样设计古诗词数据库
前端·数据库·后端
李小狼lee1 小时前
深入浅出sse协议,用代码自己实现
后端
SamDeepThinking2 小时前
并发量就算只有2,该上锁还得上呀
java·后端·架构
永远不会的CC7 小时前
浙江华昱欣实习(4月23日~ 4月19日)
后端·学习
直奔標竿7 小时前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring
嘟嘟MD7 小时前
程序员副业 | 2026年4月复盘
后端·创业
时空系8 小时前
认识Rust——我的第一个程序 Rust中文编程
开发语言·后端·rust