Java中equals和==的区别

一、Object类里面的equals方法,,源码如下图所示:

在这里插入图片描述
从上面源码图片可以看出Object类里面的equals方法也是使用 == 进行比较。

二、String类里面的equals方法,,源码如下图所示:

在这里插入图片描述

三、参考文献:

四、测试代码:

public class TestEquals {

    public static void main(String[] args) {

        // 把 abc 存入常量池中
        String s1 = "abc";
        // 从 常量池中找 abc
        String s2 = "abc";
        String s3 = s1;
        String s4 = new String("abc");
        String s5 = new String("abc");

        // DogBean里没有重写 equals 方法
        // Object 类里的 equals 方法 也是是调用 == 进行比较
        DogBean dogBean1 = new DogBean("旺旺");
        DogBean dogBean2 = new DogBean("旺旺");
        DogBean dogBean3 = dogBean1;

        PrintlnUtils.println("s1 hashCode:" + s1.hashCode() + ",  s2.hashCode: " + s2.hashCode() + ",  s3.hashCode: " + s3.hashCode() + ",  s4.hashCode: " + s4.hashCode() + ",  s5.hashCode: " + s5.hashCode());
        PrintlnUtils.println("s1 identityHashCode:" + System.identityHashCode(s1) + ", s2 identityHashCode:" + System.identityHashCode(s2) + ", s3 identityHashCode:" + System.identityHashCode(s3) + ",  s4 identityHashCode:" + System.identityHashCode(s4) + ", s5 identityHashCode:" + System.identityHashCode(s5));
        PrintlnUtils.println("s1 == s2 : " + (s1 == s2) + ",  s1 == s3 : " + (s1 == s3) + ", s1 == s4 :" + (s1 == s4) + ", s4 == s5 " + (s4 == s5));
        PrintlnUtils.println("s1.equals(s2):" + s1.equals(s2) + ",  s1.equals(s3):" + s1.equals(s3) + ",  s1.equals(s4):" + s1.equals(s4) + ",  s4.equals(s5):" + s4.equals(s5));

        PrintlnUtils.println("dogBean1.hashCode: "+dogBean1.hashCode()+", dogBean2.hashCode: "+dogBean2.hashCode()+", dogBean3.hashCode: "+dogBean3.hashCode());
        PrintlnUtils.println("dogBean1 identityHashCode:"+System.identityHashCode(dogBean1)+",dogBean2 identityHashCode: "+System.identityHashCode(dogBean2)+",dogBean3 identityHashCode: "+System.identityHashCode(dogBean3));
        PrintlnUtils.println("dogBean1 == dogBean2 : "+(dogBean1 == dogBean2)+", dogBean1 == dogBean3: "+(dogBean1 == dogBean3));
        PrintlnUtils.println("dogBean1.equals(dogBean2) : "+dogBean1.equals(dogBean2)+", dogBean1.equals(dogBean3): "+dogBean1.equals(dogBean3));

        /*
            java怎么打印一个对象的内存地址:  https://blog.csdn.net/minolk/article/details/81873611

            在Java一般使用HashCode来代表对象的地址,但是两个相同的对象就不行了,两个相同的对象的hashcode是相同的。
            如果要对比两个相同的对象的地址可以使用,System.identityHashCode(传输进去的参数是一个对象)
         */

        //s1 hashCode:96354,  s2.hashCode: 96354,  s3.hashCode: 96354,  s4.hashCode: 96354,  s5.hashCode: 96354
        //
        //s1 identityHashCode:1747585824, s2 identityHashCode:1747585824, s3 identityHashCode:1747585824,  s4 identityHashCode:1023892928, s5 identityHashCode:558638686
        //
        //s1 == s2 : true,  s1 == s3 : true, s1 == s4 :false, s4 == s5 false
        //
        //s1.equals(s2):true,  s1.equals(s3):true,  s1.equals(s4):true,  s4.equals(s5):true
        //
        //dogBean1.hashCode: 381259350, dogBean2.hashCode: 2129789493, dogBean3.hashCode: 381259350
        //
        //dogBean1 identityHashCode:381259350,dogBean2 identityHashCode: 2129789493,dogBean3 identityHashCode: 381259350
        //
        //dogBean1 == dogBean2 : false, dogBean1 == dogBean3: true
        //
        //dogBean1.equals(dogBean2) : false, dogBean1.equals(dogBean3): true

    }

    /*
         "=="操作符的作用

            1、用于基本数据类型的比较

            2、判断引用是否指向堆内存的同一块地址。

     */


}

public class DogBean {

    public int age;
    public String name;

    public DogBean() {
    }

    public DogBean(String name) {
        this.name = name;
    }

    public DogBean(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "DogBean{" +
                "狗龄 = " + age +
                ", 狗狗名字 = '" + name + '\'' +
                '}';
    }
}
public class PrintlnUtils {
    public static void println(String text) {
        System.out.println(text + "\n");
    }

    public static void println(String text,String flag) {
        System.out.println(text + "\n"+flag);
    }
}

运行结果
在这里插入图片描述

总结:

  • ==是判断两个变量或实例是否指向同一个内存空间,
  • equals是判断两个变量或实例所指向的内存空间的值是否相同
  • == 是指对内存地址进行比较 ,equals()是对字符串的内容进行比较
  • == 指引用是否相同,equals()指的是值是否相同

欢迎关注我的公众号,不定期推送优质的文章,
微信扫一扫下方二维码即可关注。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值