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

相关推荐
Remember_9932 小时前
Spring 事务深度解析:实现方式、隔离级别与传播机制全攻略
java·开发语言·数据库·后端·spring·leetcode·oracle
好好研究3 小时前
SpringBoot整合SpringMVC
xml·java·spring boot·后端·mvc
曹轲恒3 小时前
SpringBoot整合SpringMVC(末)
java·spring boot·后端
小马爱打代码3 小时前
Spring Boot:邮件发送生产可落地方案
java·spring boot·后端
程序员泠零澪回家种桔子4 小时前
OpenManus开源自主规划智能体解析
人工智能·后端·算法
Remember_9934 小时前
Spring 核心原理深度解析:Bean 作用域、生命周期与 Spring Boot 自动配置
java·前端·spring boot·后端·spring·面试
kiss strong4 小时前
springboot替换word模板&加入二维码&加水印&转为pdf
spring boot·后端·pdf
Stecurry_304 小时前
Springboot整合SpringMVC --从0到1
java·spring boot·后端
JaguarJack5 小时前
PHP 现在可以零成本构建原生 iOS 和 Android 应用 NativePHP for Mobile v3 发布
后端·php·laravel·服务端
一点程序16 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统