当前位置: 首页 > news >正文

--和equals区别

一、 Java 中的对象相等判断(核心重点)

1. 基本原则:==vsequals()
  • ==:比较内存地址。判断两个引用是否指向堆内存中的同一个对象

    • 适用场景:判断是否为null,或明确需要判断是否为单例/同一实例时。

  • equals():比较内容。默认情况下,Object类的equals()方法就是用==实现的,所以必须重写才能比较内容。

2. 正确重写equals()hashCode()

这是 Java 面试的必考点。如果重写equals()却不重写hashCode(),在使用HashMapHashSet时会出大问题。

标准写法(模板):

@Override public boolean equals(Object o) { // 1. 同一性检查:引用相同直接返回 true if (this == o) return true; // 2. 空值检查 + 类型检查 if (o == null || getClass() != o.getClass()) return false; // 3. 类型转换 User user = (User) o; // 4. 比较关键字段(注意处理空指针) return age == user.age && Objects.equals(name, user.name); } @Override public int hashCode() { // 使用 Objects.hash 自动生成哈希值 return Objects.hash(name, age); }
3. 工具类推荐(强烈推荐)

手动重写容易遗漏字段,建议使用工具库:

  • Apache Commons Lang:EqualsBuilder.reflectionEquals(obj1, obj2)

  • Lombok:​ 使用@EqualsAndHashCode注解自动生成。

  • Google Guava:Objects.equal(obj1, obj2)

4. 深度比较(Deep Equals)

如果对象内部包含了其他对象(如List<User>),需要确保内部的对象也重写了equals(),否则只会比较 List 的内存地址。


二、 JavaScript / Vue 中的对象相等判断

1. 引用比较 vs 内容比较
const obj1 = { a: 1 }; const obj2 = { a: 1 }; obj1 === obj2; // false (引用不同) JSON.stringify(obj1) === JSON.stringify(obj2); // true (但有坑)
2. 浅比较(Shallow Compare)

仅比较对象的第一层属性。

  • 适用场景:​ Vue 的computed属性依赖、React 的PureComponent

  • 实现:

    function shallowEqual(obj1, obj2) { const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) return false; return keys1.every(key => obj1[key] === obj2[key]); }
3. 深比较(Deep Compare)

递归比较所有层级的属性。

  • 注意:​ 自己写递归函数容易遇到循环引用(A 包含 B,B 包含 A)导致栈溢出。

  • 推荐方案:​ 使用Lodash​ 的_.isEqual(obj1, obj2)。这是最稳妥的方案。

4. Vue 响应式对象的特殊情况

在 Vue 3 中,如果使用reactive()创建的对象,直接比较可能会失效,因为它们被 Proxy 包装了。

  • 建议:​ 比较它们的原始值,或者使用 Vue 提供的工具函数。


三、 避坑指南(全栈必看)

场景

错误做法

正确做法

Java 比较 BigDecimal

bigDecimal1 == bigDecimal2

bigDecimal1.compareTo(bigDecimal2) == 0

Java 比较 String

str1 == str2

str1.equals(str2)

JS 比较对象

obj1 == obj2

JSON.stringify(obj1) === JSON.stringify(obj2)(顺序敏感)

JS 比较数组

[1,2] == [1,2]

[1,2].toString() == [1,2].toString()

集合比较

list1.equals(list2)

确保集合内的元素也重写了equals()


💡 面试/实战话术

场景一:Java 后端

“在判断对象相等时,我从不使用==。如果是普通的 DTO,我会使用Lombok 的@EqualsAndHashCode​ 注解来生成方法,避免手写出错。如果是BigDecimal​ 这种高精度数值,我会特意使用compareTo而不是equals,因为equals会比较精度(比如 1.0 和 1.00 会被认为不相等)。”

场景二:前端/Vue

“在 Vue 中比较对象,我通常避免使用JSON.stringify,因为它对函数、循环引用和属性顺序都很敏感。对于简单的配置对象,我用浅比较;对于复杂的表单数据对象,我直接使用Lodash 的_.isEqual,确保递归比较所有层级的数据,防止漏判。”

总结:

  • Java:​ 重写equals()+hashCode(),用工具库(Lombok/Guava)。

  • JS:​ 用 Lodash 的_.isEqual,不要自己造轮子。

http://www.gsyq.cn/news/1447172.html

相关文章:

  • UT61E万用表输入保护电路升级:低成本提升测量安全性的DIY指南
  • 基于树莓派Pico的自定义USB键盘制作:从电路设计到CircuitPython编程
  • 效率翻倍!VSCode搭配PHPStudy打造你的专属PHP开发工作流(插件配置详解)
  • 2026年广州厨卫改造深度调研:覆盖6区420户业主回访,8家综合实力企业权威评测 - 优家闲谈
  • 【CGLIB】在 MyBatis 中,CGLIB 是否有应用场景?如果有,是在哪个环节?
  • 避坑指南:ROS2里nav_msgs/Path的header和poses,90%新手都踩过的数据对齐坑
  • 尼洛替尼300mg每日两次空腹服用治慢粒,QT延长风险高,低钾低镁需纠正后用药
  • 2026年武汉老房翻新优选指南:七维评估模型筛选出的8家口碑扎实企业 - 优家闲谈
  • 接口自动化全流程
  • 程序员稳妥转行方向,好做又高薪
  • 【RT-DETR实战】 119、瑞芯微RKNN平台部署实战:从模型转换到板端推理的坑与经验
  • 抖音下载器终极指南:3分钟学会批量下载无水印视频
  • 中老年人能用的免费证件照制作入口推荐?2026爸妈也能自己操作的证件照工具 - 科技大爆炸
  • 从零打造垂直XY绘图机器人:Arduino步进电机控制与Makelangelo软件实战
  • 别再手动查漏洞了!用OWASP DependencyCheck给你的Maven项目做个自动化体检(附Jenkins流水线配置)
  • 惠州黄金奢侈品回收综合实力排行榜2026中检认证正规门店梯队推荐(惠奢汇惠城旗舰店领衔) - 生活测评小能手
  • 参数化CAD设计实战:从创意草图到三维装配的完整流程解析
  • 2026重庆GEO优化公司TOP10:技术实力与服务能力全景测评 - 品牌官
  • 告别动画重复K帧!用UE5的IK重定向器,5分钟让女武神动作适配你的自定义角色
  • 5个关键步骤掌握WorkshopDL:跨平台Steam创意工坊模组下载实战指南
  • 2026年实测:论文降AIGC降AI率怎么做?3款工具+DeepSeek/Claude指令,AIGC率99%降至5%
  • 如何用3步让旧Mac焕新?OpenCore终极重生指南
  • Unity新手必看:Assets文件夹里那些‘神秘’文件到底都是干嘛的?(附.meta文件详解)
  • 谈谈C++语言--入门篇
  • 2026年6月跨境运营工具折扣码大全 鸥鹭sif卖家精灵优麦云shulex - 李先生sir
  • AI815 3BSE052604R1 工业模拟量输入模块 12 位分辨率 HART
  • AI报告审核迎来合规新考验:IACheck助力电子原始记录规范管理,筑牢质量风控防线
  • 2026年石雕靠谱厂家推荐 景区石牌坊+汉白玉石栏杆+仿古青石板定制厂家top5排行榜+联系方式 - 海棠依旧大
  • PCB尺寸标注与层名标注规范教程
  • AD制造装配图PDF输出