Java中的equals()与==的区别与用法

发布于 2024-07-18
824

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

扫码阅读
手机扫码阅读

Java中的equals()与==的区别与用法

在Java开发中,equals()方法和==操作符常常引发混淆,主要区别在于:

  • ==操作符:用于比较两个对象的内存地址是否相等。
  • equals()方法:用于比较两个对象的内容是否相等。

示例分析

以下代码展示了两者的区别:

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2)); // 输出 true
System.out.println(str1 == str2);      // 输出 false

例子中,虽然两个字符串的内容相同,但它们的内存地址不同。因此,使用equals()方法比较内容返回true,而使用==操作符比较地址返回false。

1. 重写equals()方法

在Java中,所有类默认继承Object类,Object类的equals()方法实现如下:

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

默认情况下,equals()方法使用==操作符比较地址。如果子类不重写equals()方法,equals()和==的结果完全相同。但许多类(如String类)重写了equals()方法,以便比较内容而非地址。

特别是对于字符串对象,推荐使用如下形式创建:

String s = "Hello";

这种形式会利用字符串常量池,避免重复创建相同内容的对象,从而节省内存和提高性能。

1.1 String类的equals()方法

以下是JDK 11中String类的equals()方法实现:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String aString = (String)anObject;
        if (coder() == aString.coder()) {
            return isLatin1() 
                ? StringLatin1.equals(value, aString.value)
                : StringUTF16.equals(value, aString.value);
        }
    }
    return false;
}

此方法首先检查两个对象的内存地址是否相同。如果相同,直接返回true;如果不是,则进一步比较内容。对于字符串内容,方法根据编码方式(Latin1或UTF-16)调用不同的equals方法。

特别说明:字符编码

Latin1(ISO 8859-1)和UTF-16是两种字符编码方式,差别虽小,但针对不同编码的字符串有不同的比较逻辑。例如,UTF-16的equals()方法会逐字节比较两个字符串。

springboot葵花宝典