目录
1.概述
1.==解析
对于基本数据类型来说,==比较的是其值是否相等
对于引用数据类型来说,==比较的是其对象在堆空间中内从地址是否相等
2.equals解析
Object类中equals方法源码比较的是堆内存地址是否相等
String类,Date类,包装类等都重写了equals方法,其都比较的是内容是否相等
3.源码图解
下图为Object类equals方法直接比较是否为同一个对象
下图为String类重写的equals方法比较内容是否相等
2.例子
package system.test1;
public class demo {
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = new String("hello");
String s3=("hi");
String s4=("hi");
System.out.println(s3==s4);
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
demo d1=new demo();
demo d2=new demo();
System.out.println(d1.equals(d2));
}
}
1.jvm内存简图
2.第一个"=="比较的解析
在编译String s3=“hi"的时候其实是jvm在常量池中创建了一个内容为"hi"的地址值,然后让s3去指向"hi”,而不是把"hi"直接赋值给s3; 在编译String s4=“hi"的时候常量池中已经有了"hi"的地址值,所以让s4直接指向常量池中的"hi”,这样s3和s4的地址值都是常量池中"hi"的地址值,所以通过双等号的运算结果是true。
3.第二个"=="比较的解析
String s1=new String(""hello)的时候,要记住每new一次就会出现一个新的对象,所以这种情况是直接在堆内存中开辟了一块新的空间去储存"hello",所以此时s1和s2的地址值是不一样的,所以==结果就为false。
4.第三个与第四个equals方法的解析
object类是所有类的父类,String类自然继承了object类,其中重写了equals方法,String类equals方法比较的是其内容.s1与s2自然比较的是字符串的内容,输出为true.
d1,d2调用的equals方法为object类的equals方法.其源码为比较对象地址是否相同.demo类实例化两个对象存在于堆空间中,它们各自拥有自己的内存空间.所以地址不同,输出为false