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
本人知識有限,如有錯誤,望指出
此文系原創,轉載請聲明出處。