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

【JAVA基础面经】== 和 equals() 的区别

文章目录

  • 前言
  • ==
  • equals()
    • equals()默认与==一致
    • 重写 equals()用于比较内容
    • 自定义类重写 equals()
  • == 与 equals() 的陷阱代码

前言

== 比地址;equals 默认比地址,重写后比内容

== 用于基本类型时比较数值,用于引用类型时比较内存地址(是否为同一对象);equals() 是 Object 类的方法,默认行为与 == 相同(比较地址),但可被重写以实现内容比较(如 String、Integer 等)。

==

  1. 对于基本数据类型,只能用 ==,此时比较数值
inta=10;intb=10;System.out.println(a==b);// true,值相等doubled1=3.14;doubled2=3.14;System.out.println(d1==d2);// true
  1. 对于引用类型(对象),== 比较引用地址,s1 和 s2 是两个不同的对象,内存地址不同,因此 == 返回 false。
Strings1=newString("hello");Strings2=newString("hello");System.out.println(s1==s2);// false,因为 s1 和 s2 指向堆中不同的 String 对象

equals()

equals()默认与==一致

Object 类中的 equals() 方法默认实现就是使用 ==,所以,如果自定义类不重写 equals(),那么 equals() 的行为与 == 完全一致(比较地址)

// Object.java 中的默认实现publicbooleanequals(Objectobj){return(this==obj);}

重写 equals()用于比较内容

但很多 Java 核心类(如 String、Integer、Date 等)都重写了 equals(),用于比较对象内部的“内容”是否相等。

Strings1="hello";// 常量池Strings2="hello";// 复用常量池中的对象System.out.println(s1==s2);// true,因为地址相同(特殊优化)Strings3=newString("hello");System.out.println(s1==s3);// false,new 强制创建新对象System.out.println(s1.equals(s2));// true,因为 String 重写了 equals,比较字符序列

字符串字面量(String s = “hello”)会放入字符串常量池,相同内容的字面量指向同一对象。

自定义类重写 equals()

如果自定义类需要内容比较(例如两个 Person 对象,姓名和年龄相同就视为相等),必须重写 equals()。同时一般也要重写 hashCode(),保证一致。

publicclassPerson{privateStringname;privateintage;// 构造方法、getter/setter 省略@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null||getClass()!=obj.getClass())returnfalse;Personperson=(Person)obj;returnage==person.age&&Objects.equals(name,person.name);}@OverridepublicinthashCode(){returnObjects.hash(name,age);}}

== 与 equals() 的陷阱代码

Integera=100;Integerb=100;System.out.println(a==b);// true,因为 Integer 缓存了 -128~127Integerc=200;Integerd=200;System.out.println(c==d);// false,超出缓存范围,创建了新对象
Strings1="hello";// 常量池Strings2="hello";// 复用常量池中的对象System.out.println(s1==s2);// true,因为地址相同(特殊优化)Strings3=newString("hello");System.out.println(s1==s3);// false,new 强制创建新对象
http://www.jsqmd.com/news/611811/

相关文章:

  • G-Helper开源工具深度评测:轻量级华硕笔记本性能管理解决方案
  • 从0到1搞懂TQM:TQM才是解决质量问题的底层逻辑
  • Qwen3.5-9B-AWQ-4bit集成IDEA开发环境:Java后端智能代码补全插件实战
  • Realistic Vision V5.1本地AI摄影棚:解除安全拦截后的自然表情与微表情生成
  • MedGemma X-Ray快速体验:上传图片提问,AI自动生成影像分析报告
  • OFA模型数据库课程设计案例:构建智能图像检索系统
  • LightOnOCR-2-1B OCR模型解释性:Grad-CAM可视化关键图像区域识别依据
  • Arduino Uno R3面包板点灯保姆级教程:从元器件清单到代码烧录,一次搞定所有常见报错
  • 华为OD机考双机位C卷 - 滑动窗口最大和 (Java)
  • JSP 动作标签:动态包含、请求转发与登录跳转实战
  • Wan2.2-I2V-A14B与目标检测联动:基于YOLOv5结果的动态视频生成
  • CogVideoX-2b实战落地:中小企业低成本视频制作新路径
  • Intv_ai_mk11算法原理浅析:理解其背后的对话生成机制
  • 雯雯的后宫-造相Z-Image-瑜伽女孩效果展示:同一提示词在不同采样器(DPM++/Euler)下的差异对比
  • mysqlworkbench连接不上,非降级解决方法
  • 黑丝空姐-造相Z-Turbo与内网穿透:安全访问公司内部部署的模型服务
  • 小白必看!lite-avatar形象库保姆级教程:一键部署150+数字人
  • Streamlit+SDXL轻量部署:软萌拆拆屋镜像免配置快速上手指南
  • 使元素横向排列的方法
  • 别再手动合并Excel了!用EasyExcel自定义策略搞定复杂报表导出(附完整代码)
  • 零基础部署Phi-4-mini推理模型:5分钟搞定数学解题AI助手
  • 约束域图灵测试:在硬边界中识别语言模拟器与规则理解者
  • 如何轻松实现大润发购物卡回收变现?最全指南教你秒懂 - 团团收购物卡回收
  • Phi-4-mini-reasoning效果展示:128K上下文下长篇逻辑论证的连贯性实测
  • ide-eval-resetter:开发者必备的JetBrains IDE试用期管理工具
  • Z-Image Turbo保姆级教学:CPU Offload显存管理技巧
  • Pixel Script Temple 物联网仪表盘:为STM32传感器数据创建像素风可视化
  • ESP32与ESP8266代码移植实战:如何快速复用你的巴法云项目(附引脚修改详解)
  • 【2026年网易春招- 4月2日-第三题- 不朽荣光】(题目+思路+JavaC++Python解析+在线测试)
  • MOS管关键参数解析与应用场景指南