• 首页
  • AI工具集
  • AI资讯
  • AI活动
  • AI社区
  • AI短剧
  • AI创作大赛
  • AI小说
  • AI绘画
    AI视频
    AI音乐
    AI对口型
    AI创意二维码
    AI艺术字
    AI智能抠图
  • AI漫剧创作热门-AI社区
AI 对话

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

Java中的equals()与==的区别与用法
AITOP100
2024-03-07 14:03:53

在Java开发中有有一个看似简单,但是在网上有大量关于话题和问题,就是equals() 和 == 操作符有什么区别

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

今日内容介绍,大约花费9分钟

图片 图片

为了更好地理解这个区别,让我们看一个例子:

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

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

1. 重写.equals()方法

学习过Java基础的,应该知道Java所有类都默认继承Obejct类,Object类中有一个.equals()方法

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

从代码大家可以发现.equals()方法默认采用==操作符比较,如果子类没有重写equals()方法,那么就使用==操作符和equals()方法结果完全一样--用于比较两个对象内存地址是否相等。

但是实际情况是,有很多类重写equals()方法,这是因为内存地址比较要求比较严格,不太符合现实中所有的场景需求,比如String类,进行比较时,大多只想判断内容是否相等,并不太想知道内存地址是否相等(是否是一个对象)。

并且在深入理解Java字符串常量池文章中我们已经知道Java虚拟机为了减少内存开销和提高性能特意给字符串开辟一块空间-----字符串常量池

即推荐使用 String s = "Hello" 这种形式来创建字符串对象,而不是通过 new 关键字的方式,因为 new 需要在堆上开辟一块新的空间。

1.1. String类的equals()方法

Jdk11的String类的equals()方法

        public boolean equals(Object anObject) { //如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回true    if (this == anObject) {        return true;      } //如果是String类型的实例    if (anObject instanceof String) {   //Object类型的对象强制转换为String类型        String aString = (String)anObject;  //如果当前字符串对象和传入的字符串对象的编码方式相同        if (coder() == aString.coder()) {   //如果当前字符串和传入的字符串都是Latin1编码,则调用StringLatin1类的equals方法进行比较;如果其中一个或两个字符串是UTF16编码,则调用StringUTF16类的equals方法进行比较            return isLatin1() ? StringLatin1.equals(value, aString.value)                              : StringUTF16.equals(value, aString.value);        }    }    return false;}      

特别说明:Latin1(也称为ISO 8859-1)和UTF-16(Unicode转换格式16位)是两种不同的字符编码方式

Latin1和UTF-16虽然是两种编码方式,但是差别不大,就拿 UTF-16 的来的equals()方法来看

        @HotSpotIntrinsicCandidatepublic static boolean equals(byte[] value, byte[] other) {    if (value.length == other.length) {        int len = value.length >> 1;        for (int i = 0; i < len; i++) {            if (getChar(value, i) != getChar(other, i)) {                return false;            }        }        return true;    }    return false;}      

注意:Java8和Java11的equals()方法源码是有区别的JDK8的equals()方法

        public boolean equals(Object anObject) {    // 如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回true    if (this == anObject) {        return true;    }    // 如果是String类型的实例    if (anObject instanceof String) {        ////Object类型的对象强制转换为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;}      

1.2. 示例说明

示例一:

        new String("hello").equals("hello")      

输出结果是什么?

String类的equals方法比较的是字符串对象的内容是否相等,因为都是"Hello",所以结果是true

示例二:

        new String("hello") == "hello";      

输出结果是什么?

==操作符比较的对象地址是否相等,==左边是堆中创建对象,右边是字符串常量池对象,虽然内容相等,但是地址不相等,所以结果是false

示例三:

        new String("hello") == new String("hello");      

输出结果是什么?

new 出来的对象肯定是完全不同的内存地址,所以结果是false

示例四:

        "hello" == "h"+"ello"      

输出结果是什么?

h和ello都在字符串常量池,所以编译器在遇到+操作符的时候将其自动优化为hello,所以结果是true

示例五:

        new String("hello").intern() == "hello"      

输出结果是什么?

new String("hello") 在执行的时候,会先在字符串常量池中创建对象,然后再在堆中创建对象;执行 intern() 方法的时候发现字符串常量池中已经有了‘hello’这个对象,所以就直接返回字符串常量池中的对象引用了,那再与字符串常量池中的‘hello’比较,所以结果是true

深入解析 String.intern()已经介绍过原因

2.  其他方法比较

除了.equals()方法和"=="操作符外,还有一些其他比较方法可以使用:

  • 1.Objects.equals()方法:这个静态方法可以用于比较两个对象是否相等,不需要在调用之前判断对象是否为空。
        Objects.equals("Hello", new String("Hello")); // 返回 true      
  • 2.String类的.contentEquals()方法:这个方法可以用于比较字符串与任何字符序列(如StringBuffer、StringBuilder、String、CharSequence)是否相等。
        String str = "Hello";StringBuffer buffer = new StringBuffer("Hello");System.out.println(str.contentEquals(buffer)); // 输出 true      
0
0
原文链接:https://www.51cto.com/article/783154.html
免责声明:本文不代表本平台立场,且不构成投资建议,请谨慎对待。
全部评论
暂无评论
相关资讯
  • 万人齐聚首钢园|第二十届中国IDC产业年度大典盛大召开!

  • 每日AI资讯-2025年12月12日

  • 两部AI漫剧狂揽6.3亿播放,这套打法必须拆解学习!

  • 谷歌NotebookLM升级Ultra会员权限:生成限额提升50倍,并接入顶级Gemini模型

  • Medeo AI新版视频Agent上线:告别一次性生成,实现视频内容的动态修改

热点资讯

2025秘塔AI工具爆发式更新:API降价70%+千万月活,AI搜索市场格局生变

4天前
2025秘塔AI工具爆发式更新:API降价70%+千万月活,AI搜索市场格局生变

每日AI资讯-2025年12月09日

4天前
每日AI资讯-2025年12月09日

灵光AI助手推出网页版:电脑端可快速生成“闪应用”,数据与手机同步

4天前
灵光AI助手推出网页版:电脑端可快速生成“闪应用”,数据与手机同步

每日AI资讯-2025年12月11日

2天前
每日AI资讯-2025年12月11日

重磅消息!GLM-ASR系列模型开源,智谱AI输入法惊艳登场

3天前
重磅消息!GLM-ASR系列模型开源,智谱AI输入法惊艳登场
分享
0
0

欢迎来到AI Top100!我们聚合全球500+款AI智能软件,提供最新资讯、热门课程和活动。我们致力于打造最专业的信息平台,让您轻松了解全球AI领域动态,并为您提供优质服务。

合作伙伴
联系我们
加入AITOP100社群
加入社群
AITOP100商务微信
商务微信
相关链接
服务及隐私政策
网站地图
关于我们
粤ICP备2022124843号-2粤公网安备44030002004505广播电视节目制作经营许可证:(粤)字第00712号Copyright © 华强方特(深圳)动漫有限公司 版权所有