Object中equals的实现本质上还是 ==,即equals在没有重写之前依赖的是 ==,比较的地址
public boolean equals(Object obj) {
return (this == obj);
}
==:
1.比较基本数据类型使用的是 == ,如 short int long float double char byte
2.比较引用类型“指向”的地址是否一样用 ==
equals():
一般都要重写Object的equals()方法,让它来比较两个引用对象的属性值,equals()方法不能比较基本数据类型
以String类为例:
String str = "abc";
String str1 = "abc";
System.out.println(str==str1); //true
System.out.println(str.equals(str1)); //true
String str2 = new String("abc");
System.out.println(str == str2); //false
System.out.println(str.equals(str2)); //true
在开始这个例子之前,我们需要知道JVM处理String的一些特性。Java的虚拟机在内存中开辟出一块单独的区域,用来存储字符串对象,这块内存区域被称为字符串缓冲池。当使用 String a = "abc"
这样的语句进行定义一个引用的时候,首先会在字符串缓冲池中查找是否已经相同的对象,如果存在,那么就直接将这个对象的引用返回给a,如果不存在,则需要新建一个值为"abc"的对象,再将新的引用返回a。String a = new String("abc");
这样的语句明确告诉JVM想要产生一个新的String对象,并且值为"abc",于是就在堆内存中的某一个小角落开辟了一个新的String对象。