==与equals的区别(全网最详细

==与equals的区别(全网最详细

==与equals的区别

我们先看Demo

  	String str = "abc";
        String str1 = "abc";
        String abc = new String("abc");
        String abc1 = new String("abc");

然后我们使用==和equals挨个输出

System.out.println(str==str1);// true
System.out.println(abc==abc1);//false

这里 str==str1,结果为true,因为String str = “abc”在编译的时候,jvm将abc放入常量池,并在常量池中创建该常量的地址,然后将str去指向这个常量,当我们执行String str1 = “abc”的时候,会去常量池中寻找有没有abc这个常量,如果有,则将str1指向它,没有就创建,所以str1和str都指向常量池中的abc,故内存地址相同。

而在 String abc = new String(“abc”)中,首先会在堆内存中去开辟一个空间去存储abc,当我们再new对象的时候,还会再去开辟,所以二则的内存地址不相同,故返回false

然后再看equals输出:

 System.out.println(abc.equals(abc1));// true
 System.out.println(str.equals(abc));// true

当我们使用equals时,从上面讲的,可以知道abc与abc1,str与abc的内存地址并不相同,其在值上是相同的,那么可以得出结论equals会用==比较两个类型在内存中的地址一不一样,如果一样,则直接返回true,如果不一样,则直接往下走,再判断是否为string类型,如果不是,则强转为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;
    }

首先,equals会用==比较两个类型在内存中的地址一不一样,如果一样,则直接返回true,如果不一样,则直接往下走,再判断是否为string类型,如果不是,则强转为string类型,再将字符串数组拆分为单个字符,一一比较,有一个不相同,则返回false,否则返回true

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » ==与equals的区别(全网最详细