“==”和 equals的区别:

“==”和 equals的区别:
先说结论:“==”比较的是对象的内存地址
equals比较的是内容是否相等
先看实验结果:
实验代码:

        String str_one = "adc";
        String str_two = "adc";
        String str_three = "adcd";
        String str_four = "ad"+"c";
        String str_five = new String("adc");
        System.out.println(str_one == str_two);
        System.out.println(str_one.equals(str_two));
        System.out.println(str_one == str_three);
        System.out.println(str_one.equals(str_three));
        System.out.println(str_one == str_four);
        System.out.println(str_one.equals(str_four));
        System.out.println(str_one == str_five);
        System.out.println(str_one.equals(str_five));

实验输出结果:

true
true
false
false
true
true
false
true

结论分析:
1.通过第一组和第三组的对比,发现给String类型的对象赋值的时候,如果要赋值的是相同的字符串,那么系统其实是把这个相同字符串的地址给了多个String对象,他们指向同一个地址。
所以用“==“比较内容相同的不同String对象时候,结果是相等的,因为他们只想共同的内存地址,这里我想源码设计中用到的应该是享元设计模式,就是当代码初次定义了一个String对象并赋值”adc“之后,系统会给这个”adc“分配一块内存地址,让str_one指向这个地址,而以后如果有其他String对象再次赋值为”adc“系统不会另辟空间给该对象,而是同样让它指向之前的那块地址。

2.第二组的比较没有什么好解释的,新的String对象有新的值,就另辟一块新的内存空间。(想象力比较丰富的同学应该回想如果新的字符串内容是包括之前的”adc“的,新的字符串会不会重复利用之前的对象来组拼,我想应该是不会的,享元模式是为了一定程度上节省内存,而重复利用带来的内存节省并不足以弥补它带来的复杂度。)

3.最后的一组的对比很能说明”==“和equals方法的区别
我们重新new了一个String对象赋值给我们新创建的对象,所以肯定是系统先开劈一块新的内存地址给这个对象,然后把内容放进去。
”==“比较结果为false说明,它们的地址是不同的。
equals比较结果为true,很明显是因为我们为他们赋了相同的值

顺便说下两种创建字符串对象的区别:
** String str = “abc”;这种方式赋值的字符串是存放到栈内存的静态变量池中的,每创建一个新的String引用它就会先到静态池中寻找有没有它要赋值的字符串,有就直接指向那个对象,没有就创建一个新的。
** String str_new = new String(“abc”); 这种方法每次都会创建一个新的String对象。这里每次会创建两个对象,一个是str_new作为String对象,一个是“abc”作为内存对象保存在堆内存中。

你可能感兴趣的:(equals,区别,比较,等号,android-比较)