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

相关推荐
PFinal社区_南丞2 分钟前
现代PHP开发实战
后端·php
徐小夕8 分钟前
10k Star 的开源 AI 记忆引擎:6 行代码,用图谱+向量打造永不遗忘的 AI
前端·后端·github
czlczl200209258 分钟前
拒绝 DTO 爆炸:详解 Spring Boot 参数校验中的“分组校验” (Validation Groups) 技巧
java·spring boot·后端
兔丝11 分钟前
FastAdmin框架SSE实时消息推送实现教程
后端
悟空码字12 分钟前
SpringBoot动态脱敏实战,从注解到AOP的优雅打码术
java·后端
小鸡脚来咯18 分钟前
springboot项目包结构
java·spring boot·后端
爱学习的小可爱卢20 分钟前
JavaEE进阶——SpringBoot日志从入门到精通
java·spring boot·后端
Clarence Liu33 分钟前
Go Context 深度解析:从源码到 RESTful 框架的最佳实践
开发语言·后端·golang
踏浪无痕35 分钟前
Nacos到底是AP还是CP?一文说清楚
分布式·后端·面试
踏浪无痕37 分钟前
深入JRaft:Nacos配置中心的性能优化实践
分布式·后端·面试