你真的懂Java中的equals和==吗?看完这篇文章你就知道了

== 和 equals() 是 Java 中两个用于比较对象是否相等的操作符和方法。它们的区别主要有以下几点:

一、类型

== 是一个运算符,而 equals() 是一个方法。

二、比较对象

Java数据对象类型分为两大类:基本类型和引用类型。== 比较的对象可以是基本类型也可以是引用类型。

而 equals()不能用于判断基本数据类型的变量,比较的是引用类型的对象。可以看到x变量为基本的int类型,是不能使用equals的。

Java 数据类型分为两大类:基本类型和引用类型。

1)基本类型

基本类型是 Java 语言中内置的类型,包括整数类型、浮点类型、字符类型、布尔类型等。基本类型的对象是原始的,不能被修改。

2)引用类型

引用类型是 Java 语言中用户自定义的类型,包括类、接口、数组等。引用类型的对象是可变的,可以被修改。

三、比较内容:

1)==针对基本类型时比较的是对象的值,针对引用类型比较的是对象的指向的内存地址是否相等。

2)equals针对的比较对象是引用类型, 在Java中Object对象是所有对象的父类,所以每个类都会有个equals的方法,如果你没有重写它那些它与==的效果是一样的,可以通过源代码查看。

如果你重写了它,那么就是你自己定义的比较逻辑。比如String类型它就重写了equals方法(也就是判断对象的值是否相等而不是内存地址)。

String中的equals先用==判断是否相等,相等直接返回true->再判断是否为string类型,否直接返回false->是则继续判断对象length->循环判断char是否相等(jdk8使用的是char,高版本的jdk已使用效率更高的byte

以下是一些例子:

ini 复制代码
int x = 10;
int y = 10;

// 比较基本类型
System.out.println(x == y); // true
System.out.println(x.equals(y)); //代码会报错,不能使用equals

// 比较引用类型
String str1 = new String("Hello");
String str2 = new String("Hello");

// 默认情况下,equals() 比较引用
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true

// 重写 equals() 方法
class MyObject {
    private int id;

    public MyObject(int id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof MyObject) {
            MyObject other = (MyObject) obj;
            return this.id == other.id;
        }
        return false;
    }
}

MyObject object1 = new MyObject(1);
MyObject object2 = new MyObject(1);

// 重写 equals() 方法后,equals() 比较内容
System.out.println(object1 == object2); // false
System.out.println(object1.equals(object2)); // true

在实际开发中,应该根据实际需求来选择 == 还是 equals() 来比较对象是否相等。如果需要比较对象的引用,则可以使用 ==。如果需要比较对象的内容,则可以使用 equals()。

四、相关面试题

问题1:equals 和 == 之间的主要区别是什么?

答案:

  • == 是一个运算符,用于比较两个对象的引用是否相同,即它们是否指向内存中的相同位置。
  • equals 是一个方法,通常在Object类中定义,它用于比较两个对象的内容是否相等。默认情况下,equals方法执行与==相同的引用比较,但它可以被子类重写以提供自定义的相等性逻辑。

问题2: 如何自定义一个类的equals方法?

答案: 要自定义一个类的equals方法,可以按照以下步骤进行:

  1. 在类中创建一个equals方法的覆盖(override)。
  2. 确保方法签名为public boolean equals(Object obj),并且参数类型是Object。
  3. 在equals方法中,首先使用==运算符比较对象的引用,如果引用相同,返回true。
  4. 如果引用不同,检查传递给方法的对象是否属于相同的类。
  5. 如果属于相同的类,将传递的对象强制转换为相同类型,然后比较对象的字段,以确定它们是否相等。
  6. 最后,返回比较结果,通常是true或false。

问题3:equals 和 hashCode 之间有什么关系?

答案:

  • equals 和 hashCode 在Java中通常一起使用,以维护对象在散列集合(如HashMap和HashSet)中的正确行为。
  • 如果两个对象相等(根据equals方法的定义),那么它们的hashCode值应该相同。
  • 也就是说,如果重写了一个类的equals方法,通常也需要重写hashCode方法,以便它们保持一致。
  • 这是因为散列集合使用对象的hashCode值来确定它们在内部存储结构中的位置。

问题4:== 在哪些情况下比较的是对象内容而不是引用?

答案:

  • 在Java中,== 运算符通常比较的是对象的引用。但在以下情况下,== 可以比较对象的内容而不是引用:
    1. 对于基本数据类型(如int、char等),== 比较的是它们的值,而不是引用。
    2. 字符串常量池:对于字符串字面值,Java使用常量池来存储它们,因此相同的字符串字面值使用==比较通常会返回true。
相关推荐
醒了就刷牙27 分钟前
黑马Java面试教程_P9_MySQL
java·mysql·面试
m0_7482336433 分钟前
SQL数组常用函数记录(Map篇)
java·数据库·sql
编程爱好者熊浪2 小时前
JAVA HTTP压缩数据
java
吴冰_hogan2 小时前
JVM(Java虚拟机)的组成部分详解
java·开发语言·jvm
开心工作室_kaic2 小时前
springboot485基于springboot的宠物健康顾问系统(论文+源码)_kaic
spring boot·后端·宠物
0zxm2 小时前
08 Django - Django媒体文件&静态文件&文件上传
数据库·后端·python·django·sqlite
白宇横流学长3 小时前
基于java出租车计价器设计与实现【源码+文档+部署讲解】
java·开发语言
数据小爬虫@5 小时前
Java爬虫实战:深度解析Lazada商品详情
java·开发语言
咕德猫宁丶5 小时前
探秘Xss:原理、类型与防范全解析
java·网络·xss
F-2H6 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++