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()

相关推荐
程序员小崔日记33 分钟前
技术之外,皆是人间
后端·ruoyi·计算机温情
不懂的浪漫1 小时前
# mqtt-plus 架构解析(八):Spring Boot 自动装配,这些零件是怎么被粘合起来的
spring boot·后端·物联网·mqtt·架构
开心就好20251 小时前
Flutter iOS应用混淆与安全配置详细文档指南
后端·ios
掘金者阿豪1 小时前
记一次NFS下的权限踩坑:从“Operation not permitted”到安装成功的折腾实录
后端
妙蛙种子3111 小时前
【Java设计模式 | 创建者模式】 原型模式
java·开发语言·后端·设计模式·原型模式
阿聪谈架构2 小时前
第07章(下):LangGraph 工作流进阶 —— 检查点、人工介入与多 Agent 协作
人工智能·后端
希望永不加班2 小时前
SpringBoot 配置绑定:@ConfigurationProperties
java·spring boot·后端·spring
悟空码字2 小时前
MySQL性能优化的天花板:10条你必须掌握的顶级SQL分析技巧
java·后端·mysql
Soofjan2 小时前
Go interface 源码:iface、itab、getitab 与动态派发
后端
Soofjan2 小时前
Go interface:语法、接口值与常见坑
后端