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

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 面试常见考点,也是避免逻辑错误的关键!

相关文章:

  • C++ 的 输入输出流(I/O Streams)
  • RSGISLib:一款功能强大的GIS与RS数据处理Python工具包
  • 关于大数据的基础知识(三)——数据安全与合规
  • Python量化投资知识体系与学习路径
  • stat判断路径
  • 麒麟系统网络连接问题排查
  • 【Liunx】磁盘管理
  • day30 学习笔记
  • SpringBoot入门实战(第四篇:Redis集成配置)
  • 08前端项目----升序/降序
  • 资本怪兽贝莱德投资数据分析报告-独家
  • 基于OpenCV的骨骼手势识别分析系统
  • 仓颉造字,亦可造AI代理
  • `std::cout << xxx`
  • 虚幻基础:动画k帧
  • 抱佛脚之学SSM四
  • C++_并发编程_thread_01_基本应用
  • Python 之 pyecharts 使用
  • Yocto项目实战教程-第7章定制镜像菜谱与内核菜谱-7.2小节-定制应用程序
  • 使用Python+OpenCV将多级嵌套文件夹下的视频文件抽帧为JPG图片
  • 蔚来李斌:当下国际贸易环境有不确定性,但坚信中国汽车产业最终将占全球四成份额
  • 亮相!神二十乘组与中外媒体记者集体见面
  • 深一度|坚守17年,这件事姚明就算赔钱也在继续做
  • 最高达3521%!美国关税大棒砸向东南亚太阳能产业
  • 万斯偕印裔妻子访问印度,4天行程能否推进美印贸易谈判?
  • 竹笋食用不当,小心“鲜”变“险”