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

相关推荐
虎子_layor2 小时前
实现异步最常用的方式@Async,快速上手
后端·spring
一米阳光zw3 小时前
Spring Boot中使用 MDC实现请求TraceId全链路透传
java·spring boot·后端·traceid·mdc
王元_SmallA3 小时前
pgsql:connection failed connection to server at
java·后端
绝无仅有3 小时前
大厂面试相关文章:深入技术面试中的核心知识点
后端·面试·架构
绝无仅有3 小时前
面试文章:网络协议与redis安全,https协议,TCP三次握手,四次挥手等面试经典问题
后端·面试·架构
IT_陈寒3 小时前
7个鲜为人知的JavaScript性能优化技巧,让你的网页加载速度提升50%
前端·人工智能·后端
几颗流星3 小时前
Rust 常用语法速记 - 迭代器
后端·rust
清空mega4 小时前
从零开始搭建 flask 博客实验(4)
后端·python·flask
bcbnb4 小时前
iPhone HTTPS 抓包,从无法抓包到定位问题的流程(Charles/tcpdump/Wireshark/Sniffmaster)
后端