java中的數據類型,可分為兩類:
1.基本數據類型,也稱原始數據類型。byte,short,char,int,long,float,double,boolean
他們之間的比較,應用雙等號(==),比較的是他們的值。
2.復合數據類型(類)
當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較后的結果為true,否則比較后結果為false。 JAVA當中所有的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的內存地址,
如下圖

但在一些類庫當中這個方法被重寫了,如String,ArrayList在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。
如下圖
ArrayList中的equals

String 中的equals

對於復合數據類型之間進行equals比較,在沒有重寫equals方法的情況下,他們之間的比較還是基於他們在內存中的存放位置的地址值的,因為Object的equals方法也是用雙等號(==)進行比較的,所以比較的結果跟雙等號(==)的結果相同。
舉幾個例子
String a = "bbb";
String b = "bbb";
String c = new String("bbb");
String d = new String("bbb");
System.out.println(a==b);
System.out.println(a==c);
System.out.println(c==d);
System.out.println();
System.out.println(a.equals(b));
System.out.println(a.equals(b));
System.out.println(c.equals(d));
運行結果是
true
false
false
true
true
true
在使用==比較時
a==b返回true 說明 a b 引用同一個String對象(使用 a = "bbb" 這樣的表達是創建字符串的時候,程序首先會在這個String緩沖池中尋找相同值的對象)
a==c返回false說明 c創建了一個新的對象 (而不引用同一個”bbb”對象,新建了一個)
c==f返回 false說明d也是創建了一個新的對象。
使用equals比較時
由於比較的是內容不是地址 所以都為true
而由於復合數據類型之間進行equals比較,在沒有重寫equals方法的情況下,他們之間的比較還是基於他們在內存中的存放位置的地址值的,因為Object的equals方法也是用雙等號(==)進行比較的,所以比較的結果跟雙等號(==)的結果相同。
如下
public class EqualsDemo {
String b;
public EqualsDemo(String i){
this.b=i;
}
public static void main(String[] args) {
EqualsDemo a = new EqualsDemo("1");
EqualsDemo b = new EqualsDemo("1");
EqualsDemo d = new EqualsDemo("2");
EqualsDemo c = a;
System.out.println(a==c);
System.out.println(a==d);
System.out.println(b==c);
System.out.println(b==a);
System.out.println(a.equals(c));
System.out.println(a.equals(d));
System.out.println(b.equals(c));
System.out.println(b.equals(a));
}
}
運行結果
true
false
false
false
true
false
false
false
== 和equals結果相同
但是在實際的使用過程中我們需要比較兩個對象的內容是否相等,就如上例中對象a和對象b
所以我們要重寫equals方法。
1.自反性:對於任何非空引用x,x.equals(x)應該返回true。
2.對稱性:對於任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也應該返回true。
3.傳遞性:對於任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也應該返回true。
4.一致性:如果x和y引用的對象沒有發生變化,那么反復調用x.equals(y)應該返回同樣的結果。
5.非空性:對於任意非空引用x,x.equals(null)應該返回false。
下面為對應的重寫代碼格式
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null)
return false;
if(!(obj instanceof EqualsDemo))
return false;
EqualsDemo other = (EqualsDemo)obj;
if(b == null){
if(other.b !=null)
return false;
}else if(!b.equals(other.b))
return true;
return true;
}
重寫代碼后,運行程序,結果如下
true
false
false
false
true
true
true
true
本人知識有限,如有錯誤,望指出
此文系原創,轉載請聲明出處。
