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

Java 中 == 和 equals() 的区别

1. == 运算符

== 是 Java 中的比较运算符,用于比较两个变量的是否相等,但具体行为取决于变量的类型:

类型== 比较的内容
基本类型直接比较是否相等(如 int a = 5; int b = 5; a == b 返回 true
引用类型比较内存地址(即是否指向同一个对象),而不是对象的内容是否相同。

示例代码

String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");System.out.println(str1 == str2); // true(字符串常量池,同一对象)
System.out.println(str1 == str3); // false(不同对象,地址不同)int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2); // true(基本类型比较值)

2. equals() 方法

equals() 是 Object 类的方法,默认实现和 == 一样(比较内存地址),但许多类(如 StringInteger重写了该方法,改为比较内容是否相同

equals() 行为
Object默认比较内存地址(和 == 一样)
String比较字符串内容(字符序列是否相同)
Integer比较包装的 int 值是否相同
自定义类如果没有重写 equals(),则默认比较地址;建议重写以实现有意义的相等性比较。

示例代码

String s1 = new String("Java");
String s2 = new String("Java");System.out.println(s1 == s2);      // false(不同对象)
System.out.println(s1.equals(s2)); // true(内容相同)Integer a = 1000;
Integer b = 1000;
System.out.println(a == b);       // false(不同对象)
System.out.println(a.equals(b));  // true(值相同)// 自定义类
class Person {String name;Person(String name) { this.name = name; }@Overridepublic boolean equals(Object obj) {if (obj instanceof Person) {return this.name.equals(((Person) obj).name);}return false;}
}Person p1 = new Person("Alice");
Person p2 = new Person("Alice");
System.out.println(p1 == p2);      // false(不同对象)
System.out.println(p1.equals(p2)); // true(name 相同)

3. 关键区别总结

对比项==equals()
比较内容基本类型:值
引用类型:地址
默认比较地址,但可重写(如 String 比较内容)
适用场景判断基本类型或引用是否指向同一对象判断对象逻辑上是否“相等”(如字符串内容相同)
是否可自定义否(语言内置)是(可重写 equals()

4. 注意事项

  1. 字符串比较

    • 使用 equals() 而非 ==(除非明确需要比较地址)。

    • 常量字符串优化:String s1 = "abc" 和 String s2 = "abc" 可能指向同一对象(常量池)。

  2. 自动装箱陷阱

    Integer a = 127;
    Integer b = 127;
    System.out.println(a == b); // true(-128~127 缓存)Integer c = 128;
    Integer d = 128;
    System.out.println(c == d); // false(超出缓存范围)

  3. 重写 equals() 的规范

    • 自反性:x.equals(x) 必须为 true

    • 对称性:x.equals(y) 和 y.equals(x) 结果一致。

    • 一致性:多次调用结果不变。

    • 非空性:x.equals(null) 必须为 false


5. 如何正确使用?

  • 基本类型:用 ==(如 intdouble)。

  • 引用类型

    • 如果需要比较地址(如单例模式):用 ==

    • 如果需要比较内容(如字符串、集合):用 equals()

  • 自定义类:重写 equals()(通常需同时重写 hashCode())。

示例:安全的字符串比较

String input = getUserInput();
if ("quit".equals(input)) {  // 避免 input.equals("quit") 的 NPE 风险System.exit(0);
}

理解 == 和 equals() 的区别是 Java 面试常见考点,也是避免逻辑错误的关键!

http://www.xdnf.cn/news/1274.html

相关文章:

  • Pytorch实用教程(一):torch.compile计算提速
  • Linux内核之文件驱动随笔
  • 【Git】fork 和 branch 的区别
  • 狄拉克梳状函数的傅里叶变换
  • 联易融与中交第一航务工程局深化合作交流,共探创新发展新路径
  • 模型 替罪羊效应
  • react组件之间如何使用接收到的className(封装一个按钮案例)
  • Python 之 pyecharts 使用
  • 数字化赋能医药未来:柏强制药的战略布局与成果汇报
  • Linux系统编程 day9 SIGCHLD and 线程
  • L1-7、Prompt 的“调试技巧”
  • FPGA设计 时空变换
  • 【springsecurity oauth2授权中心】jwt令牌更换成自省令牌 OpaqueToken P4
  • 西门子PLC S7-1200按钮控制灯实例
  • day4-小白学习JAVA---开发软件_Scanner键盘录入_Random随机数_流程控制语句
  • 基于龙芯 2K1000处理器和复旦微 FPGA K7 的全国产RapidIO 解决方案研究
  • 【Pytorch 中的扩散模型】去噪扩散概率模型(DDPM)的实现
  • ProxySQL性能调优案例
  • 星光璀璨,跨界共鸣——李炳辰亮相 第十五届北影节嘉年华“音乐之旅”
  • [Java · 铢积寸累] 可变参数
  • Win10 关闭自动更新、关闭自动更新并重启
  • 实践项目开发-hbmV4V20250407-跨平台开发框架深度解析与VSCode一站式开发实践
  • 重装系统后的自用包
  • MulanPSL-1.0开源协议
  • PaddlePaddle线性回归详解:从模型定义到加载,掌握深度学习基础
  • 状态空间模型(State‐Space Model)、传递函数和极点
  • React项目添加react-quill富文本编辑器,遇到的问题,比如hr标签丢失
  • 文件操作和IO(上)
  • Towards Multi-Domain Learning for Generalizable Video Anomaly Detection
  • 一页概览:EMC Avamar备份方案