Java中==和equals的区别

Java中==和equals的区别:==和equals都是用来比较左右两边是否相等的。但二者有着很大的区别:如果比较的是8种基本数据类型(byte、short、int、long、float、double、char、boolean),只能用==进行比较。代码示例如下

package oneHundredDayPlan.twoDay;

public class One {
    public static void main(String[] args) {
        int a = 3;
        int b = 3;
        if(a==b){
            System.out.println("两个数相等");
        }else{
            System.out.println("两个数不相等");
        }
    }
}

2ee708122181422685c17a2d2763b110.png

 第一个代码运行结果为两个数相等,而第二段代码报错,这证明了当比较的是基本数据类型的时候只能用==来进行比较

如果比较的是普通的引用类型(除字符串类型) ,==和equals比较的都是地址。代码示例如下

package oneHundredDayPlan.twoDay;

public class One {
    public static void main(String[] args) {
        //创建两个引用指向同一个对象(对象名中存的地址相同)
        Object a = new Object();
        Object b = a;
        System.out.println(a==b);//true
        System.out.println(a.equals(b));//true
        //创建两个对象,内容相同,地址不同
        Object c = new Object();
        Object d = new Object();
        System.out.println(c==d);//false
        System.out.println(c.equals(d));//false
    }
}

 而对于字符串类型来说,==比较的是地址,而equals比较的是内容。代码示例如下

package oneHundredDayPlan.twoDay;

public class One {
    public static void main(String[] args) {
        //在这个例子中,尽管a和b的内容都是"HelloWorld",但由于它们是使用new关键字创建的,
        //所以它们是在堆上独立分配内存空间的两个不同对象
        String a = new String("HelloWorld");
        String b = new String("HelloWorld");
        //判断a和b的地址是否相等的
        System.out.println(System.identityHashCode(a));//460141958
        System.out.println(System.identityHashCode(b));//1163157884
        System.out.println(a==b);//false
        System.out.println(a.equals(b));//true

    }
}

equals在比较内容的时候,需要将字符串转换为字符数组,然后再通过循环进行逐一比较,但是为了提高比较效率,设置的三重判断,第一重比较两个对象的地址是否相同,如果地址相同则表示是同一个对象,返回为true,如果两个对象地址不相同,则进行第二重判断,比较对象是不是String类型的,如果不是,就返回false,如果为true则进行第三重判断,第三重判断,比较两个字符串长度是否相同,如果长度不相同,则证明这是两个字符串,如果长度相同,再进行转换为字符数组,进行按位逐一比较。

源码如下

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值