Java中的equals()和==的区别
字数 1632 2025-11-02 08:11:07

Java中的equals()和==的区别

描述
在Java中,==equals() 都用于比较操作,但它们的比较逻辑和应用场景有本质区别。理解它们的差异是掌握Java对象比较和内存模型的基础。

知识点讲解

  1. == 操作符

    • 核心功能== 是一个比较操作符。

    • 比较内容

      • 当用于比较基本数据类型(如 int, double, char, boolean 等)时,== 比较的是它们的是否相等。
      • 当用于比较引用数据类型(即对象,例如 String, 自定义类对象等)时,== 比较的是两个变量所指向的内存地址(也称为对象引用)是否相同。也就是说,它判断的是两个变量是否指向堆内存中的同一个对象
    • 示例分析

      int a = 10;
      int b = 10;
      System.out.println(a == b); // 输出 true。比较基本数据类型的值,10等于10。
      
      String str1 = "Hello";
      String str2 = "Hello";
      String str3 = new String("Hello");
      
      System.out.println(str1 == str2); // 输出 true
      System.out.println(str1 == str3); // 输出 false
      
      • str1 == str2true 的原因:由于字符串字面量的特性,"Hello" 会被放入字符串常量池。str1str2 都指向常量池中的同一个 "Hello" 对象,所以内存地址相同。
      • str1 == str3false 的原因:new String("Hello") 会在堆内存中创建一个全新的对象str3 指向这个新对象,而 str1 指向常量池中的对象。它们是两个不同的对象,内存地址自然不同。
  2. equals() 方法

    • 核心功能equals()Object 类中定义的一个方法。所有Java对象都继承自 Object 类,因此所有对象都有 equals() 方法。
    • 默认行为:在 Object 类中,equals() 方法的默认实现就是使用 == 进行比较。源码如下:
      public boolean equals(Object obj) {
          return (this == obj);
      }
      
      这意味着,如果一个类没有重写 equals() 方法,那么调用它的 equals() 方法就等同于使用 ==,比较的是内存地址。
    • 重写意义:然而,我们通常关心的是两个对象在逻辑上是否“相等”,而不是它们是否是同一个对象。因此,很多核心类库中的类(如 String, Integer, Date)都重写了 equals() 方法,用来比较对象的内容或属性值。
    • String 类的 equals() 重写String 类重写了 equals() 方法,使其比较的是字符串的内容(即字符序列)是否完全相同。
      String str1 = "Hello";
      String str3 = new String("Hello");
      
      System.out.println(str1.equals(str3)); // 输出 true
      
      • 虽然 str1str3 是两个不同的对象(== 比较为 false),但它们包含的字符序列都是 'H','e','l','l','o'。因此,equals() 方法比较内容后返回 true
  3. 总结与对比

比较项 == 操作符 equals() 方法
本质 Java中的比较运算符 Object 类定义的方法
比较对象 基本数据类型 对象引用 只能是对象(不能用于基本数据类型)
比较内容 基本数据类型:
引用数据类型:内存地址
默认比较:内存地址(同 ==
重写后比较:对象内容(由重写逻辑决定)
示例结论 str1 == str3 // false(不是同一对象) str1.equals(str3) // true(内容相同)

关键要点

  • 对于基本数据类型的比较,请务必使用 ==
  • 对于引用数据类型的比较:
    • 如果你想判断两个引用是否指向内存中的同一个对象,使用 ==
    • 如果你想判断两个对象在逻辑内容上是否相等,使用 equals()
  • 在自定义类中,如果你需要基于对象的属性来判断是否相等,你必须重写 equals() 方法(通常也需要同时重写 hashCode() 方法)。
Java中的equals()和==的区别 描述 在Java中, == 和 equals() 都用于比较操作,但它们的比较逻辑和应用场景有本质区别。理解它们的差异是掌握Java对象比较和内存模型的基础。 知识点讲解 == 操作符 核心功能 : == 是一个比较操作符。 比较内容 : 当用于比较 基本数据类型 (如 int , double , char , boolean 等)时, == 比较的是它们的 值 是否相等。 当用于比较 引用数据类型 (即对象,例如 String , 自定义类对象等)时, == 比较的是两个变量所指向的 内存地址 (也称为对象引用)是否相同。也就是说,它判断的是两个变量是否指向 堆内存中的同一个对象 。 示例分析 : str1 == str2 为 true 的原因:由于字符串字面量的特性, "Hello" 会被放入字符串常量池。 str1 和 str2 都指向常量池中的同一个 "Hello" 对象,所以内存地址相同。 str1 == str3 为 false 的原因: new String("Hello") 会在堆内存中 创建一个全新的对象 。 str3 指向这个新对象,而 str1 指向常量池中的对象。它们是两个不同的对象,内存地址自然不同。 equals() 方法 核心功能 : equals() 是 Object 类中定义的一个方法。所有Java对象都继承自 Object 类,因此所有对象都有 equals() 方法。 默认行为 :在 Object 类中, equals() 方法的默认实现就是使用 == 进行比较。源码如下: 这意味着,如果一个类 没有重写 equals() 方法,那么调用它的 equals() 方法就等同于使用 == ,比较的是内存地址。 重写意义 :然而,我们通常关心的是两个对象在 逻辑上 是否“相等”,而不是它们是否是同一个对象。因此,很多核心类库中的类(如 String , Integer , Date )都重写了 equals() 方法,用来比较对象的内容或属性值。 String 类的 equals() 重写 : String 类重写了 equals() 方法,使其比较的是字符串的 内容 (即字符序列)是否完全相同。 虽然 str1 和 str3 是两个不同的对象( == 比较为 false ),但它们包含的字符序列都是 'H','e','l','l','o' 。因此, equals() 方法比较内容后返回 true 。 总结与对比 | 比较项 | == 操作符 | equals() 方法 | | :--- | :--- | :--- | | 本质 | Java中的比较运算符 | Object 类定义的方法 | | 比较对象 | 基本数据类型 或 对象引用 | 只能是对象(不能用于基本数据类型) | | 比较内容 | 基本数据类型: 值 引用数据类型: 内存地址 | 默认比较: 内存地址 (同 == ) 重写后比较: 对象内容 (由重写逻辑决定) | | 示例结论 | str1 == str3 // false(不是同一对象) | str1.equals(str3) // true(内容相同) | 关键要点 对于基本数据类型的比较,请务必使用 == 。 对于引用数据类型的比较: 如果你想判断 两个引用是否指向内存中的同一个对象 ,使用 == 。 如果你想判断 两个对象在逻辑内容上是否相等 ,使用 equals() 。 在自定义类中,如果你需要基于对象的属性来判断是否相等,你必须重写 equals() 方法(通常也需要同时重写 hashCode() 方法)。