卡码笔记
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
  • 基础与面向对象

    • 面向对象三大特性
    • 面向对象和面向过程的区别是什么?
    • 抽象类和接口的区别?
    • 说说你对多态的理解?
    • Java中的方法重载和方法重写有什么区别?
    • Java中的final关键字可以修饰什么?被final修饰后有什么特点?
    • equals方法和==的区别
      • 简要回答
      • 详细回答
      • 知识拓展
    • 堆和栈的区别?
    • 解释一下Java中的泛型及其作用?
  • 集合

  • 异常

  • 字符串

  • JVM

  • 并发与多线程

  • JDK

  • Spring

  • 设计模式

# equals与==

# 简要回答

  • 使用"=="进行比较:
    1. ==是一个比较运算符,既可以判断基本类型,又可以判断引用类型。
    2. 如果判断基本类型,判断的是二者的值是否相等(eg : 判断1 == 1,结果为true;判断1 == 3,结果为false);
    3. 如果判断引用类型,判断的是二者的地址是否相同,即判定是否为同一对象(eg : Student student1 = new Student();,Student student2 = student1;判断student2 == student1,结果为true)。
  • 使用equals()方法进行比较:
    1. equals()方法是顶层父类Object类中的方法,equals方法本身在Object类中的源码如下 :

      public boolean equals(Object obj) {
      	return (this == obj);
      }
      
      1
      2
      3
    2. 可以看到,Object类中的 equals 方法用来检测两个对象是否相等,即默认情况下比较的是两个对象的引用(地址)。这一点和 == 用于判断引用类型时一致。

    3. equals的特点在于,它是Object类中的方法,因此,equals方法往往在子类中被重写,例如在String类中,equals方法被重写去判断两个字符串的内容是否相等。并且,在我们自己创建的类中,equals方法也常常被重写,去判断两个对象的指定的具体内容是否一致。

    4. 还有一点要注意,“==”的运行速度通常比“equals方法”更快;因为==比较引用类型时,仅比较地址;而equals方法的性能要取决于具体实现。


# 详细回答

# 使用"=="进行比较

  • 基本类型比较:直接比较两个变量的值是否相等。

    int temp_a = 10;
    int temp_b = 10;
    System.out.println(temp_a == temp_b); // true
    
    1
    2
    3
  • 引用类型比较:比较两个对象的内存地址是否相同(即是否为同一对象)。

    Object obj1 = new Object();
    Object obj2 = obj1;
    System.out.println(obj1 == obj2); // true(同一对象)
    System.out.println(new Object() == new Object()); // false(不同对象)
    
    1
    2
    3
    4

# 使用equals()方法进行比较

  • 默认行为: Object类中的 equals()方法 默认比较对象的地址,与 == 在进行引用类型比较时行为一致,equals方法本身在Object类中的源码如下 :

    public boolean equals(Object obj) {
    	return (this == obj);
    }
    
    1
    2
    3
  • 子类重写: 大多数类会 重写 equals() 以比较对象的内容而非地址。eg:

    1. String类:比较字符串的字符序列。

      String s1 = new String("Hello");
      String s2 = new String("Hello");
      System.out.println(s1 == s2);       // false(地址不同)
      System.out.println(s1.equals(s2));  // true(地址不同但内容相同)
      
      1
      2
      3
      4
    2. Integer类:比较整数值。

    3. 自定义类:按照实际业务逻辑手动重写 equals()方法,比较指定内容。


# 知识拓展

# == 和 equals 的jvm示意图

  1. 使用==进行比较的 内存图解:
    image
  2. 使用equals()进行比较的 内存图解:
    image

# 重写 equals()的注意事项

  1. 遵守 equals() 契约:

    • 自反性:a.equals(a) 必须为 true。
    • 对称性:若 a.equals(b) 为 true,则 b.equals(a) 必须为 true。
    • 传递性:若 a.equals(b) 和 b.equals(c) 为 true,则 a.equals(c) 必须为 true。
    • 一致性:多次调用 a.equals(b) 结果应一致(除非对象被修改)。
    • 非空性:a.equals(null) 必须为 false。
  2. 必须同时重写hashCode() : 若两个对象通过 equals()方法 比较为 true,则它们的 hashCode() 必须相同。代码演示如下:

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // 使用相同字段生成哈希值
    }
    
    1
    2
    3
    4
  3. 正确处理 null 和 对象类型: 在 equals()方法中 需检查参数是否为 null 或对象类型是否匹配。代码演示如下:

    @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
    2
    3
    4
    5
    6
    7
  4. Objects.equals()方法源码如下:
    image.png


Last Updated: 3/10/2026, 6:08:48 PM

← Java中的final关键字可以修饰什么?被final修饰后有什么特点? 堆和栈的区别? →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪