equals和==区别到底在哪里?(这一篇就够了!!)

本文详细解析了Java中==与equals的区别,说明了在不同情况下的行为:==用于比较对象的内存地址,而equals在被重写后可以用于比较对象的内容。通过具体的代码示例展示了未重写equals方法时其默认行为与String类重写equals方法后的行为差异。

结论:
双= 是比较内存地址的!!!
equals重写的情况下 是比较内容的!!!
equals不重写的情况下,还是比较内存地址的!!!
**

不信看Object中equals的源码!
在这里插入图片描述
可以看出,Object中的equals的底层还是调用==来实现的。

1:先看没重写equals方法的类

class MyClass {
    private String id;
    private String name;
    private String sex;

    public MyClass(String id, String name, String sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
    }
}
public class OOMTest {


    public static void main(String[] args) {

     MyClass c1=new MyClass("1","a","男");
     MyClass c2=new MyClass("2","b","女");

     System.out.println(c1==c2);
     System.out.println(c1.equals(c2));
	//结果
	false
	false
 }

双=:
由于对象时new出来的 ,所以c1和c2在堆上是完全不同的两块空间,所以双=比较肯定是false。
equals:
由于Myclass类并没有重写equals方法,所以他底层调用的时候,还是用的==
比较的还是内存地址。


2:再看下重写equals的String类

 public static void main(String[] args) {

        String s1 = "abc";
        String s2 = "abc";

        String s3 = new String("abc");
        String s4 = new String("abc");
        String s5 = new String("def");
        //==
        System.out.println("s1==s2:" + (s1 == s2));
        System.out.println("s1==s3:" + (s1 == s3));
        System.out.println("s3==s4:" + (s3 == s4));
		//equals
        System.out.println("--------------------");
        System.out.println("s1.equals(s2):" + (s1.equals(s2)));
        System.out.println("s1.equals(s3):" + (s1.equals(s3)));
        System.out.println("s1.equals(s5):" + (s1.equals(s5)));
		//结果
		s1==s2:true
		s1==s3:false
		s3==s4:false
		--------------------
		s1.equals(s2):true
		s1.equals(s3):true
		s1.equals(s5):false
    }

由于String类是重写了 equals方法的 所以:equals比较的是内容

为什么s1等于s2呢
(可能大家在这里比较好奇哈)?
我们声明的对象String s1=“abc”; 是存放在常量池中 ,当我们在创建String s2=“abc”;的时候它会先去常量池中查找是否存在"abc"这个对象,如果存在就会让s2直接指向该对象而不会再去创建该对象。所以得出结果s1、s2 使用 equals、== 比较结果都为true。
但是本质上是不一样的 ,前者是内存地址相同,后者是内容相同哈!

再磨叽一遍!
双= 是比较内存地址的!!!
equals重写的情况下 是比较内容的!!!
equals不重写的情况下,还是比较内存地址的!!!

双= 是比较内存地址的!!!
equals重写的情况下 是比较内容的!!!
equals不重写的情况下,还是比较内存地址的!!!
**

双= 是比较内存地址的!!!
equals重写的情况下 是比较内容的!!!
equals不重写的情况下,还是比较内存地址的!!!
**

Java 中,`==``equals`在多个方面存在区别: - **定义与类型不同**:`equals()`是超类`Object`中的方法;`==`是操作符[^1]。 - **比较对象不同**: - `equals()`:通常用来检测两个对象的内容是否相等。`equals()`方法存在于`Object`类中,而`Object`类是所有类的直接或间接父类,因此所有的类都有`equals()`方法。不过在`Object`类里,`equals()`方法的初始行为是比较对象的内存地址,其源码为`public boolean equals(Object obj) { return (this == obj); }`。在一些类(像`String`、`Integer`等)中对`equals`方法进行了重写,重写后会比较对象的值。而没有对`equals`进行重写的类就只能从`Object`类中继承`equals`方法,其`equals`方法与`==`等效,除非在此类中重写了`equals`方法[^1][3][4][5]。 - `==`:用来比较引用比较基本数据类型时具有不同的功能。对于基础数据类型(如`byte`、`short`、`char`、`int`、`long`、`float`、`double`、`boolean`),`==`比较的是它们的值是否相等;对于引用数据类型,`==`比较的是引用的地址是否相同,即比较所指向对象的地址值[^1][2][5]。 - **运行速度不同**:`==`运行速度比`equals()`快,因为`==`只是比较引用,而`equals()`方法可能涉及更多的逻辑判断,没有`==`运行速度快[^1]。 以下是示例代码: ```java public class ComparisonExample { public static void main(String[] args) { // 基本数据类型比较 int a = 5; int b = 5; System.out.println(a == b); // true // 引用数据类型比较 String str1 = "hello"; String str2 = new String("hello"); System.out.println(str1 == str2); // false System.out.println(str1.equals(str2)); // true // 未重写 equals 方法的类 class MyClass { int value; MyClass(int value) { this.value = value; } } MyClass obj1 = new MyClass(10); MyClass obj2 = new MyClass(10); System.out.println(obj1 == obj2); // false System.out.println(obj1.equals(obj2)); // false } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值