equals和==

在看别人写代码的时候,有时候会看到用==,有时候看到equals,今天写中缀转后缀时,发现了这两个还是有挺大的区别的。

首先,java中提供了8种基本数据类型,分别是:byte,short,long,int,float,double,boolean,char
对于基本数据类型,他们进行比较的时候用的是:==,比较的是他们的值

其次,对于引用数据类型,引用数据类型分为三种:类 Class,接口 Interface,数组 Array
此时==比较的是地址值
在默认情况下,equals比较的也是地址值,但是在一些类库中对equals方法就行了重写,比如:String,在\src\java\lang目录中找到String类,发现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;
    }

可以看出重写的equals方法先比较了地址,若地址相同则两者的值肯定相等,若地址不同,再去比较长度和内容,最后得到的就是两个字符串的值是否相同,不仅仅是比较了地址。
在java中生成一个字符串有两种方式:

//1
String s1="zifuchuan"String s2="zifuchuan"//2
String s3=new String("zifuchuan")
String s4=new String("zifuchuan")

在这里插入图片描述
在这里插入图片描述
对于第一种情况:
在这里插入图片描述

此时使用“==”来比较两个字符串,得到的结果是true,因为带有" "的对象在字符串常量池中保存,且一旦要创建相同的字符串时,那么就将这个字符串的引用,直接指向这个字符串,而不是创建一个新的字符串。并且,字符串常量池中的对象不会被java的垃圾回收器回收。由于此时两个引用指向的是一个字符串常量对象,因此两者是相同的。因为其存储的内存地址是相同的。

对于第二种情况:
两个变量分别指向两个不同的对象,其内存地址肯定不相同,而==比较的是地址,所以得到的false,而经过重写的equals方法比较的是值,所以得到的true。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值