Java中的==和equals()区别小结

 更新时间:2023年08月14日 08:18:09   作者:修己xj  
在Java编程中,理解==操作符和equals()方法的区别是至关重要的,本文主要介绍了Java中的==和equals()区别,具有一定的参考价值,感兴趣的可以了解一下

在 Java 编程中,比较对象的相等性是一个常见的任务。然而,你是否知道在 Java 中有两种不同的方法来比较对象的相等性:== 操作符和 equals() 方法?本文将深入探讨这两种方法之间的区别以及何时使用它们。

== 操作符

首先,让我们来看看 == 操作符。在 Java 中,== 操作符用于比较两个对象的引用是否相等,也就是判断它们是否指向内存中的同一个对象。如果两个对象的引用指向同一个内存地址,== 操作符返回 true,否则返回 false。

例如如下代码:

        String str1 = new String("xj");
        String str2 = new String("xj");
        String str3 = str1;
        System.out.println(str1 == str2); // 输出 false,因为两个不同的对象
        System.out.println(str1 == str3); // 输出 true,引用指向同一个对象

equals() 方法

equals() 方法是 Object 类中定义的方法,用于比较两个对象的内容是否相等。默认情况下,equals() 方法在 Object 类中的实现与 == 操作符的行为相同,即只比较对象的引用。然而,许多类会覆盖 equals() 方法,以便在内容上比较对象。

我们先来看下Object equals()方法的源码:

    public boolean equals(Object obj) {
        return (this == obj);
    }

可以看到,它使用的也是 == 操作符去判断的,所以我们如果要使用equals()判断我们自定义的对象的值是否相等时需要重写 equals() 方法,java 中其它的一些类基本都会重写equals()方法;

String 类的源码:

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

可以看到它是先比较两个对象是否为同一对象,是的话直接返回true,然后在判断传入的参数是否为String,不是的话返回false,是的话在比较两个String 的值是否相同;

Integer 类源码:

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

AbstractMap 类源码:

    public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof Map))
            return false;
        Map<?,?> m = (Map<?,?>) o;
        if (m.size() != size())
            return false;
        try {
            Iterator<Entry<K,V>> i = entrySet().iterator();
            while (i.hasNext()) {
                Entry<K,V> e = i.next();
                K key = e.getKey();
                V value = e.getValue();
                if (value == null) {
                    if (!(m.get(key)==null && m.containsKey(key)))
                        return false;
                } else {
                    if (!value.equals(m.get(key)))
                        return false;
                }
            }
        } catch (ClassCastException unused) {
            return false;
        } catch (NullPointerException unused) {
            return false;
        }
        return true;
    }

我们自定义的User 类

import java.util.Objects;
public class User {
    private String name;
    private String address;
    private String userId;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(userId, user.userId);
    }
    @Override
    public int hashCode() {
        return Objects.hash(userId);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
}

可以看到如果User对象不为null的话我们equals() 方法只需比较两个User对象的userId的值是否相同,相同的话即为同一对象,不需要比较其他属性。

区别详解

现在,让我们总结一下 == 操作符和 equals() 方法的区别:

  • == 操作符比较对象的引用,判断是否为同一对象。
  • equals() 方法比较对象的内容,但默认情况下与 == 的行为相同(比较引用)。
  • 一些类会覆盖 equals() 方法以便在内容上进行比较,例如 String、Integer、Double 等。

当你需要比较对象的内容时,务必使用适当的方法。同时要注意处理参数为 null 的情况,以及在自定义类中正确地覆盖 equals() 方法,以便在语义上正确地比较对象内容。

总结

在 Java 编程中,理解 == 操作符和 equals() 方法的区别是至关重要的。通过本文的解释,相信你已经对这两种方法有了更清晰的认识。根据具体情况,选择正确的比较方式将有助于你编写更健壮和可靠的代码。

到此这篇关于Java中的==和equals()区别小结的文章就介绍到这了,更多相关Java ==和equals()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文了解SpringBoot是如何连接数据库的

    一文了解SpringBoot是如何连接数据库的

    Spring Boot提供了一系列的开箱即用的功能和特性,使得开发人员可以快速构建和部署应用程序,下面这篇文章主要给大家介绍了关于SpringBoot是如何连接数据库的相关资料,需要的朋友可以参考下
    2023-06-06
  • Javassist之一秒理解java动态编程

    Javassist之一秒理解java动态编程

    概述Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果。
    2019-06-06
  • IDEA自动生成TestNG的testng.xml的插件方法

    IDEA自动生成TestNG的testng.xml的插件方法

    这篇文章主要介绍了IDEA自动生成TestNG的testng.xml的插件方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • springboot定时任务备份mysql数据库的实现示例

    springboot定时任务备份mysql数据库的实现示例

    为了防止数据库被清库或者误删数据库的情况,所以需要定时将mysql数据库中的数据进行备份,本文主要介绍了springboot定时任务备份mysql数据库的实现示例,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Springboot整合freemarker 404问题解决方案

    Springboot整合freemarker 404问题解决方案

    这篇文章主要介绍了Springboot整合freemarker 404问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Eclipse创建java程序可执行jar包教程

    Eclipse创建java程序可执行jar包教程

    这篇文章主要为大家分享了Eclipse创建java程序可执行jar包教程,具有一定的实用性和参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • spring-data-jpa中findOne与getOne的区别说明

    spring-data-jpa中findOne与getOne的区别说明

    这篇文章主要介绍了spring-data-jpa中findOne与getOne的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 深入理解SpringBoot中关于Mybatis使用方法

    深入理解SpringBoot中关于Mybatis使用方法

    这篇文章主要介绍了SpringBoot中关于Mybatis使用方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-03-03
  • Java中使用正则表达式获取网页中所有图片的路径

    Java中使用正则表达式获取网页中所有图片的路径

    这篇文章主要介绍了Java中使用正则表达式获取网页中所有图片的路径,本文直接给出实例代码,需要的朋友可以参考下
    2015-06-06
  • 使用java代码获取新浪微博应用的access token代码实例

    使用java代码获取新浪微博应用的access token代码实例

    这篇文章主要介绍了使用java代码获取新浪微博应用的access token实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05

最新评论