400 128 6709

行业新闻

J*a中的equals()与==的区别与用法

发布时间:2024-03-07点击次数:

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

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

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

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

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

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

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()方法

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

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

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

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

在深入研究J*a字符串常量池的文章中,我们已经了解到J*a虚拟机为了优化内存利用和提升性能而专门为字符串分配了一个独立的空间——字符串常量池。

建议优先使用 String s = "Hello" 这种方式创建字符串对象,而非使用 new 关键字,因为 new 需要额外在堆上分配内存空间。

1.1. String类的equals()方法

Jdk11的String类的equals()方法

public boolean equals(Object anObject) { //如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回trueif (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;}

注意:J*a8和J*a11的equals()方法源码是有区别的JDK8的equals()方法

public boolean equals(Object anObject) {// 如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回trueif (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

启科网络PHP商城系统 启科网络PHP商城系统

启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。

启科网络PHP商城系统 0 查看详情 启科网络PHP商城系统

示例二:

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

以上就是J*a中的equals()与==的区别与用法的详细内容,更多请关注其它相关文章!


# java  # 转换为  # 苏州专业的网站优化推广公司  # 泰州网站百度排名推广  # 长沙网站推广g智投未来长沙网站推广  # 常规推广营销优势  # 律师做推广宣传的网站  # 国外视频网站优化排名  # 批量建设网站  # 广州seo优化推广公司  # 百度营销策划推广  # 顺义网站优化推广  # 有一个  # 使用技巧  # 两种  # 不太  # 都是  # 重写  # 结果是  # 池中  # 子类  # 字符串常量  # string类  # true  # 对象 


相关栏目: 【 行业新闻62819 】 【 科技资讯67470


相关推荐: 特斯拉机器人面世 未来将大幅提振磁材需求,引领人工智能时代  科技有狠活|时光修复师 :用AI让昨日重现  腾讯TRS之元学习与跨域推荐的工业实战  Midjourney创始人:AI应该成为人类思想的延伸  清华&中国气象局大模型登Nature:解决世界级难题,「鬼天气」预报时效首次达3小时  调查:过半数艺术家认为 AI 作图无法帮助他们的工作  首部国内AI辅助动画片《魔游纪:人工智能辅助篇》预告发布  阿里云推出通义万相AI绘画大模型  报道称亚马逊正在测试AI生成产品评价摘要  世界人工智能大会中西部县域数字就业中心组团亮相  2025 WAIC|美团无人机发布第四代新机型  马斯克讽刺人工智能炒作:什么“机器学习”,其实就是统计  Yann LeCun团队新研究成果:对自监督学习逆向工程,原来聚类是这样实现的  以分布式网络串联闲置GPU,这家创企称可将AI模型训练成本降低90%  “世界上最像人的机器人”接入 Stable Diffusion ,现场完成作画  世界人工智能大会(WAIC 2025)点燃魔都,博尔捷数字科技携前沿技术产品亮相  微软必应聊天现已在Chrome和Safari浏览器上可用,但仍有许多限制存在  苹果在韩举办首届中小企业智能制造论坛,加速推动工业4.0发展  中国气象局预测:到 2030 年,中国人工智能气象应用将达到国际领先水平  标小智LOGO推出AI公司起名生成器“Name.GPT”  MIT开发“PhotoGuard”技术保护图像免遭恶意AI编辑  小米9号员工李明宣布创业:打造首款安卓桌面机器人  乐天派桌面机器人加入小米米家生态系统,实现与其他智能设备的互联  「电子果蝇」惊动马斯克!背后是13万神经元全脑图谱,可在电脑上运行  找对了风口想不火都难,乐天派机器人,安卓机器人的最终形态?  西班牙小鲜肉*视频在网上疯传,本人发文澄清:是AI换脸的假视频!  联想浏览器引入小乐 AI 助手,成功接入百度文心一言大模型,经过实测证实  “世界人工智能之都”的新烦恼:AI热潮无法拉动大量就业  大模型新品出现井喷,AI产业迎来新时代  南京制造的国产工业机器人:在外资品牌竞争中突围,年销售1.8万台  2025VR&AR显示技术峰会展示歌尔光学最新一代光学模组  一文看懂基础模型的定义和工作原理  AI大模型产品集体奔赴高考考场,教育赛道的讯飞星火能赢吗?  盘古大模型3.0正式发布 AI开发正走向新“工业化开发模式”  无人机协助盐城交通执法的协同训练  关于开展“与AI共创未来”——2025年全国青少年人工智能创新实践活动的通知  微软为 AI 初学者推出免费网课:为期 12 周,共 24 节课  世界人工智能大会|“AI领航,共筑未来”高端保险论坛成功举办  讯飞听见会写“会议摘要”功能全面升级,AI更懂你的关注点  城市在采用人工智能方面进展如何?  OpenOOD更新v1.5:全面、精确的分布外检测代码库及测试平台,支持在线排行榜、一键测试  旷视入选北京市通用人工智能产业创新伙伴计划  烟台大学学生首次在全国大学生无人机航拍竞赛中获奖  马斯克预测:特斯拉全自动驾驶将在今年实现 对AI深度变化感到担忧  你们的开机第一屏画面要变了!安卓机器人首次3D化  生成式AI引路产业加速来袭,微美全息探索“AIGC+虚拟人”融合应用  特斯拉人形机器人将亮相 预计售价不超过15万元  美图发布国内首个“懂美学的”AI视觉大模型MiracleVision  微软新出热乎论文:Transformer扩展到10亿token  Meta Quest订阅服务每月7.99美元畅玩两款VR游戏应用 

400 128 6709
E-mail

contact@tlftec.cn

扫一扫,添加微信

©  云南淘乐房科技有限公司 版权所有  滇ICP备2025071560号  

云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司