Equals和==的区别

当我们看到这个面试题的时候,相信大多数同学脑海中浮现的肯定是 == 比较的是引用,equals比较的是值,但是真实情况,equal是简单的比较值吗?下面我们通过看下equals的源码来分析一下:

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;
}

首先在代码刚开始的位置使用了==,这代码如果两个对象的引用地址地址是相同的,那么默认对象的值也是相等的。

后面判断如果传入的是String 对象,那么就对String对象中的每个char进行元素比较,如果全相等,那两个对象就相等。

为什么String的equals方法之所以比较的是值?大家有没有明白了?

因此,String中equals的比较可以用下图来演示:

内存地址分配

特殊的String定义

String除了通过new的形式进行定义,还可以通过等号赋值的形式:

String str = "10";

这是一种非常特殊的形式,不需要new就可以产生对象,和new有本质的区别。

String str = "10"
String str1 = "10";
String str2 = new String("10");
System.out.println(str == str1);  // return true
System.out.println(str == str2);  // return false
System.out.println(str.equals(str1));  // return true
System.out.println(str.equals(str2));  // return false

要想理解上面第四行为什么==也会返回True,我们需要深入理解下JVM内存分配管理方式

JVM内存分布

当我们定义了一个String str = “10” , 相当于我们定义了一个字符串常量,并没有去New一个字符串对象,这种形式的赋值存在于常量池中,而不是像new一样存放在堆中。当声明这样一个字符串时,JVM会在常量池中先查找有没有对应值的对象。如果有,把它赋给当前引用,即原来的引用和现在的引用指向了同一对象。如果没有,则在常量池中新创建一个对象,以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象,而new形式创建String对象是每次调用就产生一个新的对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值