当前位置: 首页 > 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.jsqmd.com/news/935830/

相关文章:

  • UT61E万用表输入保护电路升级:低成本提升测量安全性的DIY指南
  • 未来十年红利赛道!薪资碾压传统行业 3 倍,人才缺口 327 万
  • 基于压电传感器与555定时器的低成本靶标命中指示器DIY指南
  • Tinkercad制作SpaceX火箭发射动画:零门槛3D建模与可视化编程实践
  • 2026中小企业数字化营销一网推SEO和GEO优化推广发展研究报告 - 招财兔数字员工
  • 基于LM3915芯片与LED灯带打造动态音频VU表:从原理到实践
  • 为什么 Superpowers 的 brainstorming skill 坚决不写代码?我翻了它的源文件
  • Dragino LPS8网关配置Helium轻量级热点实战指南
  • Windows Defender恢复技术深度解析:系统安全组件重新启用的专业方法
  • 从CAD建模到CNC加工:复古迷你音箱的创客实践全流程解析
  • 【RT-DETR实战】118、英伟达Jetson平台TensorRT部署深度优化:从内存泄漏到推理帧率翻倍实战手记
  • 基于Arduino与LM35的智能温控风扇系统:从传感器到继电器的完整实践
  • 微软 Surface Laptop Ultra 搭载英伟达新芯片,对标 MacBook Pro 今年晚些时候上市
  • 基于树莓派Pico的自定义USB键盘制作:从电路设计到CircuitPython编程
  • Windows实时语音识别工具TMSpeech:完全离线的智能会议助手
  • 效率翻倍!VSCode搭配PHPStudy打造你的专属PHP开发工作流(插件配置详解)
  • 保姆级教程:在Ubuntu 20.04上为AirSim ROS包添加自定义控制接口(以角速度推力为例)
  • 2026年广州厨卫改造深度调研:覆盖6区420户业主回访,8家综合实力企业权威评测 - 优家闲谈
  • Arduino机械臂DIY指南:从零搭建桌面级机器人助手
  • 【CGLIB】在 MyBatis 中,CGLIB 是否有应用场景?如果有,是在哪个环节?
  • 避坑指南:ROS2里nav_msgs/Path的header和poses,90%新手都踩过的数据对齐坑
  • 7-2.开题报告、选题表、任务书可以直接用吗
  • 2026 年虎门除甲醛公司怎么选?专业度、资质、售后全维度对比,优先推荐东莞佰家环保 - 专注室内空气检测治理
  • 2026年武汉老房翻新优选指南:七维评估模型筛选出的8家口碑扎实企业 - 优家闲谈
  • 尼洛替尼300mg每日两次空腹服用治慢粒,QT延长风险高,低钾低镁需纠正后用药
  • QMCDecode终极指南:如何在Mac上免费解锁QQ音乐加密格式,实现跨平台自由播放
  • Arduino步进电机与旋转编码器实现手摇曲柄远程控制方案
  • 接口自动化全流程
  • 5分钟掌握kill-doc:终极免费文档下载自动化工具指南
  • DIY终极焊接工作站:集成A4放大镜、无影照明与六爪辅助手