Java 中 == 和 equals 的区别?

目录

两者的区别

特殊案例

equals:

==:

重写equals的意义

示例


Java中“==”和“equals()”都是用于比较两个对象是否相等,但是他们之间还是有着许多不同之处。

两者的区别

“==”是一个操作符,用于比较两个操作数的值是否相等。如果操作数为值类型,比较的是值是否相等,如果操作数为引用类型,比较的是地址值是否相等。

“equals()”是一个定义在Object类中的方法,默认情况下,它也是判断两个对象的值是否相等,即与"=="操作符等效。“equals()”方法通常被用于比较对象的内容是否相等,它是一个实例方法,需要被重写以实现自定义的对象比较逻辑。

特殊案例

  • 案例1:

    String str1 = "hello";
    String str2 = "hello";
    String str3 = new String("hello");
    System.out.println(str1 == str2); // true
    System.out.println(str1 == str3); // false

    在上面的例子中,str1和str2都是指向同一个字符串常量池中的"hello"字符串,所以它们的引用相等返回true。而str3则是通过new关键字新创建了一个String对象,它的引用指向堆内存中另外一个地址,与str1的引用地址不相等返回false。

  • 案例2:

    在Java中,对于小于等于127的整数类型和char类型的包装类型,会存在缓存机制。也就是说,当使用自动装箱或者调用valueOf()方法创建这些包装类型的对象时,如果值在-128到127之间,那么会从缓存中直接返回一个已经存在的对象,而不是新建一个对象,从而提高了性能和减少了内存开销。

     
        
    Integer a = 100;
    Integer b = 100;
    System.out.println(a == b); // true
    Integer c = 200;
    Integer d = 200;
    System.out.println(c == d); // false

    在上面的例子中,由于100在-128到127之间,所以a和b都会引用同一个对象,因此“==”运算符返回true;而200不在这个范围内,c和d会分别引用不同的对象,所以返回false。需要注意的是,这种缓存机制只针对自动装箱和valueOf()方法,而直接调用构造函数创建对象时则不会使用缓存。对于包装类型推荐使用 equals 方法进行判断。

equals:

   equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

==:

   ==比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

  • 如果 == 比较的是基本数据类型,那么比较的是两个基本数据类型的值是否相等;

  • 如果 == 是比较的两个对象,那么比较的是两个对象的引用,那么就是比较两个对象的引用是否相等,也就是判断两个对象是否指向了同一块内存区域;

举个例子:==是判断两个人是不是住在同一个地址,而equals是判断同一个地址里住的人是不是同一个

代码示例:

public class EqualsTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Integer aaa=new Integer(5);
        Integer bbb=new Integer(5);
        
        int a=10;
        int b=10;
        String str1=new String("justice");
        String str2=new String("justice");
        String str3;
        str3=str1;
        
        
        System.out.println(aaa==bbb);
        System.out.println(aaa.equals(bbb));
        System.out.println(a==b);
        
        System.out.println(str1==str2);
        System.out.println(str1.equals(str2));
        
        
        System.out.println(str1==str3);
        System.out.println(str1.equals(str3));
    }

}

结果输出

Java 中 == 和 equals 的区别?_第1张图片

aaa和bbb都是Integer封装类型,是不同的对象,变量存储地址, 所以==结果为false,equals为true

a和b都是基本数据类型,变量存储值,所以==为true,基本数据类型无equals方法(没有意义)

str1和str2都是String类型,属于引用类型,变量存储地址,所以==为false,equals为true

创建str3的时候,str3指向了str1,所以str1和str3的指向同一个地址,存储的数据自然相同,所以均为true

重写equals的意义


你可能会问,既然默认情况下 equals 和 == 都是比较引用,那为什么还需要重写 equals 方法呢?

这是个好问题!Java中的很多类,比如 String、Integer 等,都已经重写了 equals 方法,使其能够进行内容比较。这就是为什么我们可以这样做:

Java 中 == 和 equals 的区别?_第2张图片

如果没有重写 equals,上述代码块是不会被执行的,因为默认情况下 equals 比较的是引用。

示例


为了更好地理解这两者的区别,我们举个实例来说明。

在这个例子中,我们定义了一个 Person 类,重写了 equals 方法,用于比较两个 Person 对象的 name 字段是否相等。接下来我们来看几个例子:

Java 中 == 和 equals 的区别?_第3张图片

从输出结果中可以看出,== 对于 person1 和 person2 来说返回 false,因为它们是不同的对象。而 equals 则返回 true,因为我们重写了 equals 方法来比较内容。

你可能感兴趣的:(#,java,java)