Java中==和equals()的终极对比

        在 Java 中,== 和 equals() 是两种不同的比较机制,它们的区别主要体现在 ‌比较对象类型‌ 和 ‌比较逻辑‌ 上:


‌一、== 运算符

  • 基本数据类型‌(如 intdoubleboolean 等)
    == 直接比较 ‌值是否相等‌。

int a = 5;
int b = 5;
System.out.println(a == b); // true(值相等)
  • 引用类型‌(如对象、数组、String 等)
    == 比较 ‌内存地址是否相同‌(即是否指向同一个对象)。 
String s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1 == s2); // false(不同对象,内存地址不同)

‌二equals() 方法

  • 默认行为‌(未重写时):
    继承自 Object 类,底层使用 == 比较内存地址。

Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1.equals(obj2)); // false(比较地址,等同 ==)
  • 重写后的行为‌:
    多数 Java 类(如 StringInteger、自定义类)会重写 equals(),使其比较 ‌对象的内容是否等价‌。

String s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1.equals(s2)); // true(内容相同)

‌三、关键区别总结

==equals()
适用类型基本类型 + 引用类型仅引用类型
比较依据基本类型:值;引用类型:内存地址默认比较地址,重写后比较内容
示例场景int、直接赋值字符串常量池比较String、自定义对象内容比较

 四、经典案例:String 的两种创建方式

 1、字符串常量池‌:
String a = "Java";          // 常量池中创建
String b = "Java";          // 直接引用常量池中的对象
System.out.println(a == b); // true(内存地址相同)
  2、显式 new 对象‌:
String c = new String("Java");  // 堆中新建对象
String d = new String("Java");  // 堆中另一个对象
System.out.println(c == d);     // false(地址不同)
System.out.println(c.equals(d));// true(内容相同)

五、注意事项

1、‌自定义类‌必须重写 equals() 才能实现内容比较:

class Person {
    String name;
    public boolean equals(Object obj) {
        if (obj instanceof Person) {
            return this.name.equals(((Person) obj).name);
        }
        return false;
    }
}

2、重写 equals() 必须同时重写 hashCode()‌,确保哈希一致性(例如在 HashMap 中正确使用)。

3‌、避免空指针‌:推荐使用 Objects.equals(a, b)(Java 7+)安全比较:

String s1 = null;
String s2 = "Java";
System.out.println(Objects.equals(s1, s2)); // false(不会抛异常)

 六、总结

  • ==‌:基本类型比值,引用类型比地址。
  • equals()‌:默认比地址,重写后比内容。
  • 实践建议‌:引用类型比较内容时,优先用 equals(),但对可能为 null 的对象使用工具类 Objects.equals()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码的余温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值