Java日常开发的21个坑-为什么不建议用a.equals(b)判断对象相等-《Java笔记》

admin 2025-10-19 03:02:59 编程 来源:ZONE.CI 全球网 0 阅读模式

Java a.equals(b)

一、值是null的情况

  1. a.equals(b),a 是null, 抛出NullPointException异常。
  2. a.equals(b),a不是null, b是null, 返回false
  3. Objects.equals(a, b)比较时,若a 和 b 都是null,则返回 true,如果a 和 b 其中一个是null,另一个不是null,则返回false。注意:不会抛出空指针异常。

    1. null.equals("abc") 抛出 NullPointerException 异常
    2. "abc".equals(null) 返回 false
    3. null.equals(null) 抛出 NullPointerException 异常
    4. Objects.equals(null, "abc") 返回 false
    5. Objects.equals("abc",null) 返回 false
    6. Objects.equals(null, null) 返回 true

    二、值是空字符串的情况

  4. a 和 b 如果都是空值字符串:””,则 a.equals(b),返回的值是true,如果a和b其中有一个不是空值字符串,则返回false;

  5. 这种情况下 Objects.equals 与情况1 行为一致。
    1. "abc".equals("") 返回 false
    2. "".equals("abc") 返回 false
    3. "".equals("") 返回 true
    4. Objects.equals("abc", "") 返回 false
    5. Objects.equals("","abc") 返回 false
    6. Objects.equals("","") 返回 true

    三、源码分析

    1.源码 ```java
  • @since 1.7 */ public final class Objects { private Objects() {

    1. throw new AssertionError("No java.util.Objects instances for you!");

    }

    /**

    • Returns {@code true} if the arguments are equal to each other
    • and {@code false} otherwise.
    • Consequently, if both arguments are {@code null}, {@code true}
    • is returned and if exactly one argument is {@code null}, {@code
    • false} is returned. Otherwise, equality is determined by using
    • the {@link Object#equals equals} method of the first
    • argument. *
    • @param a an object
    • @param b an object to be compared with {@code a} for equality
    • @return {@code true} if the arguments are equal to each other
    • and {@code false} otherwise
    • @see Object#equals(Object) */ public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); } } ``` 2.说明首先,进行了对象地址的判断,如果是真,则不再继续判断。如果不相等,后面的表达式的意思是,先判断a不为空,然后根据上面的知识点,就不会再出现空指针。所以,如果都是null,在第一个判断上就为true了。如果不为空,地址不同,就重要的是判断a.equals(b)。

      四、“a==b”和“a.equals(b)”有什么区别?

      如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true。而 a.equals(b) 是进行逻辑比较,当内容相同时,返回true,所以通常需要重写该方法来提供逻辑一致性的比较。
以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  0