听说你不明白Java里"=="和"equals()"的正确使用姿势?

本文详细解析了Java中==与equals的区别,包括它们的工作原理、应用场景及如何正确使用。通过示例代码展示了两者在基本类型与引用类型比较时的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java程序里用来测试两个变量是否相等有两种方式,那就是我们今天要深入讨论的“==”和“equals()”。相信我们的Java程序员对它都不陌生吧。去面试时也是频率很高的被面试官问到,当然了,为了打发面试官而去了解它们未免功利心太强了吧,毕竟我们在写代码时经常跟它们打交道的……废话不多说,让我们开始探索吧
【欢迎各位大神批评指正,转载请保留链接……谢谢!我的简书

一、“==”和“equals()”的区别

1、“==”是关系运算符,“equals()”是Object类中定义的一个方法
2、用途:

“==”用于判断两个基本类型的值是否相等或两个引用变量(通过类定义的变量)的引用地址是否相等,换句话说,也就是两个引用变量是否指向同一个对象,类似C语言里的指针变量是否指向同一个地址。

“equals()”用于判断引用变量所指向的内存地址的存储内容是否相等。

二、实例代码分析

public class TestEquals 
{
    public static void main(String[] args)
    {
        int a = 3;
        int b = 3;
        //比较基础类型变量a和b的值是否相等,输出true
        System.out.println("a==b:"+(a == b));

        String s1 = new String("hello");
        String s2 = new String("hello");
        //比较引用变量s1和s2是否指向同一个对象,输出false
        System.out.println("s1==s2:"+(s1 == s2));
        //比较s1和s2的内容是否相等,输出true
        System.out.println("s1.equals(s2):"+s1.equals(s1));

        String s3 = "hello";
        String s4 = "hello";
        //输出true
        System.out.println("s3==s4:"+(s3 == s4));
        //输出true
        System.out.println("s3.equals(s4):"+(s3.equals(s4)));

        String s5 = "hello";
        String s6 = new String("hello");
        //输出false
        System.out.println("s5==s6:"+(s5 == s6));
        //输出true
        System.out.println("s5.equals(s6):"+(s5.equals(s6)));

    }
}

输出结果如下:

a==b:true
s1==s2:false
s1.equals(s2):true
s3==s4:true
s3.equals(s4):true
s5==s6:false
s5.equals(s6):true
特别注意:Object类里的equals()方法是直接使用"=="实现的,所以在自定义类时建议重写equals()方法,实现自己所需要的比较规则,比如String等类都已经对equals()方法重写了!
Object类中的equals()方法代码如下:

public boolean equals(Object obj) {
        return (this == obj);
    }

String类中的equals()方法代码如下:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            //判断两个字符串的长度是否相等
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                //循环比较每个字符是否相等
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

对于初学者而言,当看到s3和s4的比较结果时可能就会迷惑了,此时我们就有必要来了解下JVM中“常量池”这个概念了……
当我们使用“hello”这种形式来创建对象时,JVM就会用常量池来管理这些字符串,JVM保证常量池中的字符串内容是唯一的;而使用new String("hello")的形式的话,“hello”则会被存放在堆(Heap)里面,如下图所示:


总结:“==”是用来比较两个变量的值是否相等,但由于引用类型变量是通过类似C语言里的指针形式来存储对象内容的,也就是说引用变量存储的是对象内容的地址,如上图中s2引用变量所示,所以在用“==”比较两个引用变量时比较的是两个引用变量是否指向同一个对象(即:堆内存的同一个地址);如果要比较两个字符串的内容是否相等时则只能用String类的equals()方法。


### Java 中 `==` `equals()` 的区别 在 Java 编程语言中,`==` `equals()` 主要用于比较两个实体是否相等,但两者的工作方式应用场景有所同。 #### 操作符 `==` `==` 是一个操作符,在处理基本数据类型时,它直接比较数值上的相等性;当应用于对象引用时,则是比较两个引用所指向的对象在内存中的地址。这意味着即使两个同实例拥有完全相同的内部状态,只要它们是同一内存位置的实例,使用 `==` 进行比较的结果就是相等[^1]。 ```java int a = 5; int b = 5; System.out.println(a == b); // true, 基本类型间的值比较 Object objA = new Object(); Object objB = new Object(); System.out.println(objA == objB); // false, 同对象的引用地址同 ``` #### 方法 `equals()` `equals()` 是定义于 `Object` 类的方法,默认行为类似于 `==`,即仅当两个引用指向同一个对象时返回 `true`。过,很多常用类库已经对该方法进行了覆盖(重写),以便提供基于实际内容而非仅仅依据引用地址来决定平等性的能力。例如,`String`, `Integer` 等包装器类均实现了自己的版本以支持按逻辑意义下的“等于”。 ```java // 使用 String 类作为例子展示 equals() String s1 = "hello"; String s2 = "hello"; System.out.println(s1.equals(s2)); // true, 字符串内容相同 // Integer 类同样重写了 equals 方法 Integer num1 = 42; Integer num2 = 42; System.out.println(num1.equals(num2)); // true, 数字值相同 ``` 为了确保程序具有良好的可读性预期功能,开发者应当根据具体上下文选择合适的比较手段: - 当需要验证两个变量是否确切指的是同一个对象实例时,应该采用 `==`; - 如果目标是在语义层面评估两者的相似度或一致性——比如检查字符串是否有同样的字符序列或是整数持有相同的数值——则应调用相应的 `equals()` 实现[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值