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; }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值