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