Java中equals()方法和==的区别
对于https://blog.****.net/u010921701/article/details/52821843做了个小总结
一.对于基本数据类型
==和equals()都只比较两者数值
二.对于引用类型
i==和equals()都只比较两者地址在栈内存中的地址
三.而对于重写了equals()方法的String(本质上是第二种引用类型),则有少许不同:
从上面看出,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(虽然地址不同,但值相同)