Skip to content
作者:daily5am创建:-更新:-
字数:预计阅读: 分钟访问量:--

Java中==和equals()的区别

题目描述

请详细说明Java中==equals()的区别,并举例说明它们的使用场景。

核心知识点

1. == 运算符

==是Java中的比较运算符,用于比较两个变量的值。

  • 基本数据类型: 比较的是实际的值
  • 引用数据类型: 比较的是对象的内存地址(引用)

2. equals() 方法

equals()是Object类中定义的方法,用于比较两个对象的内容是否相等。

  • 默认实现: Object类中的equals()方法实际上就是使用==进行比较
  • 重写: 大多数类(如String、Integer等)都重写了equals()方法,用于比较对象的内容

详细解答

== 运算符的使用

java
// 基本数据类型比较
int a = 10;
int b = 10;
System.out.println(a == b); // true,比较的是值

// 引用数据类型比较
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false,比较的是内存地址

equals() 方法的使用

java
// String类的equals()方法
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // true,比较的是内容

// 自定义类的equals()方法
class Person {
    private String name;
    private int age;
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }
}

常见陷阱

1. String的常量池

java
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");

System.out.println(s1 == s2); // true,都指向常量池中的同一个对象
System.out.println(s1 == s3); // false,s3是新创建的对象
System.out.println(s1.equals(s3)); // true,内容相同

2. 包装类的比较

java
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,超出缓存范围
System.out.println(c.equals(d)); // true,使用equals()比较

最佳实践

  1. 基本数据类型: 使用==进行比较
  2. 引用数据类型:
    • 比较引用是否相同:使用==
    • 比较内容是否相同:使用equals()
  3. 重写equals()时: 必须同时重写hashCode()方法,遵循equals()和hashCode()的契约

相关题目

  • String、StringBuilder、StringBuffer的区别
  • HashMap的底层实现原理
  • ConcurrentHashMap的实现原理

💡 提示: 理解==equals()的区别是Java基础中的重点,在面试中经常被问到。记住:==比较引用,equals()比较内容(需要正确重写)。