Java中equals()方法和==的区别

对于https://blog.****.net/u010921701/article/details/52821843做了个小总结

一.对于基本数据类型

==和equals()都只比较两者数值

二.对于引用类型

i==和equals()都只比较两者地址在栈内存中的地址

 

三.而对于重写了equals()方法的String(本质上是第二种引用类型),则有少许不同:

Java中equals()方法和==的区别

从上面看出,String的equals()方法是先比较地址,再比较值;

而==在String中依旧只比较两者地址在栈内存中的地址(因为String本质上属于第二种引用类型)

Java中String是一个特殊的包装类数据有两种创建形式:
String s = "abc";
String s = new String("abc");    
    第一种先在栈中创建一个对String类对象引用变量s,然后去查找"abc"是否被保存在字符串常量池中,如果没有则在栈中创建三个char型的值'a'、'b'、'c',然后在堆中创建一个String对象object,它的值是刚才在栈中创建的三个char型值组成的数组{'a'、'b'、'c'},接着这个String对象object被存放进字符串常量池,最后将s指向这个对象的地址,如果"abc"已经被保存在字符串常量池中,则在字符串常量池中找到值为"abc"的对象object,然后将s指向这个对象的地址。
    第一种特点:JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。如果栈中存在需要创建的对象,则将引用s指向已存在的对象,不存在则创建新的对象
    第二种可以分解成两步1、String object = "abc"; 2、String s = new String(object); 第一步参考第一种创建方式,而第二步由于"abc"已经被创建并保存到字符串常量池中,因此jvm只会在堆中新创建一个String对象,它的值共享栈中已有的三个char型值。
    第二种特点:一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象。

就第三种,举个栗子~

String a = "abc";//会新分配一个地址

String b = "abc";//因为abc已经存在,所以不会分配新的地址

String c = new String("abc");//不管abc存不存在,都会分配新地址

System.out.println(a==b);//只比较地址,为true

System.out.println(a==c);//只比较地址,所以为false

System.out.println(a.equals(b));//先比较地址,后比较值,为true(地址相同,值相同)

System.out.println(a.equals(c));//先比较地址,后比较值,true(虽然地址不同,但值相同)