Java 中的equals()与 ==的联系与区别

标题== 与equals() 的联系

== 号在比较时,无论变量是基本类型还是引用类型,比较的都是变量的值。

  • 基本变量的值就是我们看到的值。
  • 引用变量的值是一个指向堆内存地址的值,一个指针(Java 没有指针的 概念),一个引用,本质上也是一个值。

默认情况下,从Object继承而来的 equals 方法与 = 是完全等价的,因为底层调用的是 = 号,但我们可以重写equals方法,使其按照我们的需求方式进行比较。

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

二者的区别

这两个本质上是一样的,非要说区别的话,那就是 equals 是Object 类中的一个方法,支持在子类中按照自己的意愿重写比较逻辑,仅此而已。

==:判断两个对象是否是同一个。
equals:(重写后)比较两个变量是否的等价。

示例代码

package com.jj.eq;

import org.junit.jupiter.api.Test;

public class TestEqual {
    @Test
    public void testEqual() {
        String s1 = "abc";//常量池中
        String s2 = "abc";//常量池中
        /*
        1、 == :比较变量的值是否相等.
        2、s1和 s2都是引用变量,此时变量的值是,其值是引用对象的地址.
        3、"abc" 在常量池中复用,是同一个对象,因此 s1和 s2的值 是用一个引用,因此 s1==s2,返回true
         */
        System.out.println(s1 == s2);
        /*
        s1.equals(s2) : 比较两个对象的值是否相等,即比较两个对象的内容是否相等;true
         */
        System.out.println(s1.equals(s2));//比较值变量的值是否相等;true
        System.out.println(s1.hashCode());//获取对象的哈希码;96354
        System.out.println(s2.hashCode());//获取对象的哈希码;96354
        System.out.println("identityHashCode(s1) = "+System.identityHashCode(s1));//获取对象的哈希码;1800031768
        System.out.println("identityHashCode(s12) = "+System.identityHashCode(s2));//获取对象的哈希码;1800031768
    }

    @Test
    public void testEqual2() {
        /*
        s1 和 s2 都是引用变量,它们引用的(值)是堆中的不同对象,因此 s1==s2,返回false
         */
        String s1 = new String("good");//堆中,s1指向堆中的对象
        String s2 = new String("good");//堆中,s2指向堆中的另一个对象,值与s1的值相同
        /*
        s1 == s2 : 比较两个对象的地址是否相等,即比较两个对象的地址是否相等;false
         */
        System.out.println("(s1 == s2) = " + s1 == s2);//比较对象的地址是否相等;false
        /*
        s1.equals(s2) : 比较两个对象的值是否相等,即比较两个对象的内容是否相等;true
         */
        System.out.println("s1.equals(s2) = " + s1.equals(s2));//比较对象的值是否相等;true
        System.out.println("s1.hashCode() = "+s1.hashCode());//获取对象的哈希码;3178685
        System.out.println("s2.hashCode() = "+s2.hashCode());//获取对象的哈希码;3178685
        System.out.println("identityHashCode(s1) = "+System.identityHashCode(s1));//获取对象的哈希码;1076770748
        System.out.println("identityHashCode(s12) = "+System.identityHashCode(s2));//获取对象的哈希码;2041416495
    }
    @Test
    public void testEqual3() {
        Integer a = 128;
        Integer b = 128;
        System.out.println(a == b);// 输出:false, 因为两个对象的值相同,但是内存地址不同,所以不相等
        System.out.println(a.hashCode());///获取对象的哈希码;128
        System.out.println(b.hashCode());///获取对象的哈希码;128
        System.out.println("identityHashCode(a) = "+System.identityHashCode(a));//获取对象的哈希码;2124643775
        System.out.println("identityHashCode(b) = "+System.identityHashCode(b));//获取对象的哈希码;1262773598
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值