JAVA中对象的几种比较

Java 中对象的几种比较方式详解

Java 中对象的“比较”主要分为两种需求:

  1. 判断两个对象是否“相等”(内容是否相同)
  2. 判断两个对象的大小关系(排序用)

对应地,Java 提供了多种机制来实现对象的比较。下面系统讲解最常见的几种方式,并对比它们的适用场景。

1. == 和 != (引用比较)

本质:比较两个引用是否指向堆内存中的同一个对象(地址是否相同)。

Strings1=newString("hello");Strings2=newString("hello");Strings3=s1;System.out.println(s1==s2);// false(不同对象)System.out.println(s1==s3);// true(同一对象)

特点

  • 比较的是内存地址
  • 速度最快
  • 适用于判断是否是“同一个对象”

适用场景:检查对象引用是否相同(如单例模式判断)。

2. equals() 方法(内容相等性比较)

本质:Object 类默认实现是 ==(地址比较),但大多数类(如 String、Integer、Date 等)都重写了 equals() 来比较内容。

Strings1=newString("hello");Strings2=newString("hello");System.out.println(s1.equals(s2));// true(内容相同)

自定义类使用 equals()
必须重写 Object 的 equals() 方法,通常配合 hashCode() 一并重写(遵守契约)。

classPerson{privateStringname;privateintage;@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null||getClass()!=obj.getClass())returnfalse;Personperson=(Person)obj;returnage==person.age&&(name==null?person.name==null:name.equals(person.name));}@OverridepublicinthashCode(){returnObjects.hash(name,age);}}

特点

  • 比较对象内容是否相等
  • 可自定义比较逻辑
  • 与 hashCode() 必须一致(用于 HashMap、HashSet 等)

适用场景:判断业务意义上的“相等”(如用户名相同即认为同一用户)。

3. compareTo() 方法(自然顺序比较)

实现接口:Comparable

用途:定义对象的“自然顺序”(默认排序方式),常用于排序(如 TreeSet、Arrays.sort())。

classStudentimplementsComparable<Student>{privateStringname;privateintscore;@OverridepublicintcompareTo(Studento){// 按分数降序,相同再按姓名升序intresult=Integer.compare(o.score,this.score);if(result==0){returnthis.name.compareTo(o.name);}returnresult;}}// 使用List<Student>list=newArrayList<>();Collections.sort(list);// 自动按 compareTo 定义的顺序排序

返回值规则

  • 返回负数:this < o
  • 返回 0:this == o
  • 返回正数:this > o

适用场景:对象有唯一的、默认的排序规则(如按年龄、按姓名)。

4. Comparator 接口(外部比较器)

用途:提供灵活的、临时的比较规则,不修改类本身。常用于多条件排序或临时排序。

List<Student>list=newArrayList<>();// 按分数升序list.sort(Comparator.comparingInt(s->s.getScore()));// 按姓名升序,再按分数降序list.sort(Comparator.comparing(Student::getName).thenComparing(Comparator.comparingInt(Student::getScore).reversed()));// 匿名比较器(旧方式)list.sort(newComparator<Student>(){@Overridepublicintcompare(Students1,Students2){returns1.getScore()-s2.getScore();}});

特点

  • 不需要修改类
  • 可定义多种比较规则
  • 支持链式组合(thenComparing)

适用场景:需要多种排序方式,或无法修改原类(如第三方类)。

对比总结表
比较方式比较内容是否可自定义典型用途示例类/接口
== / !=引用地址不可判断是否同一对象所有对象默认支持
equals()对象内容相等性可(需重写)判断业务上是否相等(如登录验证)String、包装类已重写
compareTo()大小(自然顺序)可(实现 Comparable)默认排序(如列表排序)String、Integer 已实现
Comparator大小(外部规则)灵活排序、多条件排序Collections.sort()、stream.sorted()
实战建议(最佳实践)
  1. 自定义类

    • 总是成对重写equals()hashCode()(用 IDE 自动生成或Objects.hash)。
    • 如果需要排序,实现Comparable或提供Comparator
  2. 使用工具类

    • Objects.equals(a, b):安全避免空指针。
    • Comparator.comparing():Lambda 方式写比较器,更简洁。
  3. 常见误区

    • 只重写 equals() 没重写 hashCode() → HashMap/Set 行为异常。
    • 用 == 比较 String 内容 → 结果不可靠(受字符串池影响)。
一句话总结
  • 想判断“是不是同一个对象”→ 用==
  • 想判断“内容是否相同”→ 重写equals()
  • 想排序,且有默认规则→ 实现Comparable
  • 想灵活排序→ 用Comparator

掌握这几种比较方式,你就能在集合操作、业务判断、排序等场景游刃有余!

如果想看具体场景代码(如排序 Person 列表的多种方式),随时告诉我!🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1135362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云服务器按小时计费:节省50%算力开支的方法

云服务器按小时计费&#xff1a;节省50%算力开支的方法 背景与挑战&#xff1a;AI生成任务的算力成本困局 在当前AIGC&#xff08;人工智能生成内容&#xff09;爆发式增长的背景下&#xff0c;图像转视频&#xff08;Image-to-Video&#xff09;等高算力需求任务已成为内容创作…

【Java毕设全套源码+文档】基于springboot的网络云端日记本系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Sambert-HifiGan语音合成服务的自动化测试方案

Sambert-HifiGan语音合成服务的自动化测试方案 引言&#xff1a;为何需要自动化测试&#xff1f; 随着语音合成技术在智能客服、有声阅读、虚拟主播等场景中的广泛应用&#xff0c;服务稳定性与输出质量的一致性成为工程落地的关键挑战。Sambert-HifiGan 作为 ModelScope 平台上…

性能测试集成CI/CD实战:构建高效软件质量防线

在敏捷开发和DevOps浪潮中&#xff0c;性能测试不再是项目末期的“附加项”&#xff0c;而是CI/CD&#xff08;持续集成/持续部署&#xff09;管道的核心环节。本文面向软件测试从业者&#xff0c;深入探讨如何将性能测试无缝集成到CI/CD流程中&#xff0c;提升软件交付速度与质…

你的提示词够精准吗?Image-to-Video动作控制秘诀揭秘

你的提示词够精准吗&#xff1f;Image-to-Video动作控制秘诀揭秘 引言&#xff1a;从静态图像到动态叙事的跨越 在生成式AI快速演进的今天&#xff0c;Image-to-Video&#xff08;I2V&#xff09;技术正成为连接视觉创意与动态表达的关键桥梁。传统图像生成模型虽能创造逼真画面…

基于 SpringBoot + jQuery 实现留言板功能

基于 Spring Boot jQuery 实现留言板功能&#xff08;完整实战教程&#xff09; 本教程将手把手教你使用 Spring Boot 3.x 作为后端 jQuery 作为前端交互&#xff0c;实现一个简洁美观的留言板系统。功能包括&#xff1a; 查看所有留言&#xff08;分页可选&#xff09;提交…

【Java毕设源码分享】基于springboot+vue的校园失物招领平台的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

程序员副业新思路:用Image-to-Video接单变现

程序员副业新思路&#xff1a;用Image-to-Video接单变现 从技术到变现&#xff1a;Image-to-Video的商业潜力 在AI生成内容&#xff08;AIGC&#xff09;爆发式增长的今天&#xff0c;静态图像生成已趋于成熟&#xff0c;而动态视觉内容的需求正在快速崛起。短视频平台、广告创…

基于S7-200Smart PLC的恒压供水程序与485通讯样例+人机触摸屏操作实践案例

S7-200Smart 恒压供水程序样例485通讯样例 触 摸屏样例子。 1.此程序样例为一拖二恒压供水样例&#xff0c;采用S7-200Smart PLC和smart 700触摸屏人机与abb变频器485通讯执行变频器PID实现恒压供水&#xff0c;商品同样包含S7-200PLC程序 2.程序为实际操作项目案例程序&#…

Java后端如何对接AI?Image-to-Video API调用示例

Java后端如何对接AI&#xff1f;Image-to-Video API调用示例 &#x1f4cc; 背景与目标&#xff1a;Java服务集成图像转视频AI能力 随着生成式AI技术的快速发展&#xff0c;越来越多企业希望将动态内容生成能力嵌入现有系统。本文聚焦于一个实际工程场景&#xff1a;如何在Java…

度量标准重构:从“点击诱饵”到“知识节点”的评估体系设计

引言&#xff1a;评估危机与范式重构的必要性 在信息过载的数字时代&#xff0c;内容评估体系正面临系统性失效。传统以点击率&#xff08;CTR&#xff09; 为核心的度量标准&#xff0c;催生了“标题党”和浅层内容的泛滥&#xff1b;新兴的参与度指标&#xff08;停留时间、…

如何快速掌握STIX Two字体:面向学术写作新手的完整教程

如何快速掌握STIX Two字体&#xff1a;面向学术写作新手的完整教程 【免费下载链接】stixfonts OpenType Unicode fonts for Scientific, Technical, and Mathematical texts 项目地址: https://gitcode.com/gh_mirrors/st/stixfonts STIX Two字体是专为科学、技术和数学…

生成效果差?输入图像选择的4个黄金法则

生成效果差&#xff1f;输入图像选择的4个黄金法则 引言&#xff1a;为什么输入图像如此关键&#xff1f; 在使用 Image-to-Video 图像转视频生成器&#xff08;基于 I2VGen-XL 模型&#xff09;的过程中&#xff0c;许多用户发现即使调整了提示词和参数&#xff0c;生成的视频…

HTML5+CSS3+JavaScript实现高木同学圣诞树GalGame完整开发指南

HTML5 CSS3 JavaScript 实现高木同学圣诞树 GalGame 完整开发指南 《擅长捉弄的高木同学》&#xff08;Teasing Master Takagi-san&#xff09;是一部受欢迎的动漫&#xff0c;高木同学以调皮可爱著称。本教程将指导你使用纯前端技术&#xff08;HTML5、CSS3、JavaScript&am…

Sambert-HifiGan在智能家居中的应用:让设备开口说话

Sambert-HifiGan在智能家居中的应用&#xff1a;让设备开口说话 引言&#xff1a;语音合成如何赋能智能设备的“人性化”表达 随着智能家居生态的不断演进&#xff0c;用户对交互体验的要求已从“能用”升级为“好用、自然、有情感”。传统的机械式语音播报已无法满足现代家庭…

西门子博图 WinCC V15 大型自动化系统项目实战分享

西门子博图WinCC V 15大型自动化系统项目&#xff0c;包含多台服务器客户端项目&#xff0c;系统采用安全1516F -3PN/DP 外挂多台精智面板&#xff0c;1200PLC ET200SP 变频器 对整个工艺过程PID DCS 闭环过程控制&#xff0c;如何调整温度压力流量液位等参数&#xff0c;实用工…

揭秘9款AI论文工具:免费写开题报告的隐藏技巧,导师不会说!

警告&#xff1a; 接下来的内容&#xff0c;可能会颠覆你对论文写作的认知。90%的学生还在为开题报告和文献综述熬夜秃头&#xff0c;而少数“聪明人”已经用上了导师圈秘而不宣的“黑科技”&#xff0c;效率提升十倍不止。这些工具的真正玩法&#xff0c;导师绝不会在课堂上公…

突破限制:OpenCore Legacy Patcher让旧款Mac焕发新生的完整指南

突破限制&#xff1a;OpenCore Legacy Patcher让旧款Mac焕发新生的完整指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 当你的MacBook Pro或iMac被苹果官方标记为&quo…

【Java毕设全套源码+文档】基于springboot的物流配送中心信息化管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

从传统TTS迁移到Sambert-HifiGan:完整迁移指南与注意事项

从传统TTS迁移到Sambert-HifiGan&#xff1a;完整迁移指南与注意事项 引言&#xff1a;为何要从传统TTS转向Sambert-HifiGan&#xff1f; 在中文语音合成&#xff08;Text-to-Speech, TTS&#xff09;领域&#xff0c;传统系统长期依赖拼接法或参数化模型&#xff08;如Tacotro…