java 中 == 和 equals()的比较与分析 (详细)

java的两种数据类型:

1.基本数据类型:

8种:byte   short   long   int   float   double   char   boolean

基本数据类型是没有方法的,所以它们没有equals()方法,它们之间的比较是用“==”,比较的是它们在栈中的地址。

如int a = 6;这里a是一个指向int类型的引用,指向6这个字面值。

另外在这里提一下栈的特性,存在栈中的数据是可以共享的,比如:

int a = 4; int b = 4;

编译器先处理int a = 4;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为4的地址,没找到,就开辟一个存放4这个字面值的地址,然后将a指向3的地址。接着处理int b = 4;在创建完b这个引用变量后,由于在栈中已经有4这个字面值,便将b直接指向4的地址。这样,就出现了a与b同时均指向4的情况。(地址指向的值在栈内存当中,切不可理解为地址指向堆内存中,基本数据类型是存放在栈内存当中的。)

2.引用数据类型:

当使用 == 比较的时候:比较的是它们的内存地址,当new出来一个新得对象的时候,会给这个对象分配一个新得内存地址,这个时候再比较的话,即使“字面值”相同,返回的也是false

当使用equals()比较的时候: equals()方法会先比较是不是同一个对象,如果是,则返回true,如果不是判断是否为相同类型,如果是,在进行比较。更详细理解看下面的String的equals()源码。

另外再提一下引用数据类型的存储方式,以便更好的理解:

引用数据类型在栈中存储的是地址,来指向堆内存的实例。

下面用一些代码证实一下:

package practice;

/**
 * @author YoungXinLer
 * date 2018/8/4 17:09
 */

public class Test {
    public static void main(String args[]){
        String str1 = "abc";
        String str2 = "abc";
        String strNew = new String("abc");
        Integer integer = 1;
        String strNew1 = "1";
        //引用数据类型 == 比较
        System.out.println(str1 == str2);
        //引用数据类型 equals() 比较
        System.out.println(str1.equals(str2));
        //通过New 来分配新的堆空间来存放这个实例对象,先用 == 比较
        System.out.println(str1 == strNew);
        //通过New 来分配新的堆空间来存放这个实例对象,再用 equals() 比较
        System.out.println(str1.equals(strNew));
        //通过不同类型的引用类型的对象,来验证euqals()的源码
        System.out.println(strNew1.equals(integer));
    }
}

运行结果:

 附上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;

    }

希望可以帮到你,如有不对,敬请指教.

猜你喜欢

转载自blog.csdn.net/YoungXinLer/article/details/81413532
今日推荐