對於string型別而言,一般用「==」或者equales做相等比較,前者比較字串的引用,後者比較字串的值。
字串常量的值儲存於常量池中,只要值相同,那麼引用的就是同乙個字串常量,也就是說,==和equals效果一樣。
字串物件儲存於堆中,不同的物件在堆上的記憶體位址是不一樣的。因此,建立兩個值相等的string物件,其引用的位址是不相等的。也就是說,用 == 比較時不等,用equals比較時相等。
integer是int的包裝型別,通常直接賦值即可。比較時用==還是equals呢?看下面的例子:
integer t1 = 129;
integer t2 = 129;
integer t3 = 119;
integer t4 = 119;
system.out.println(t1 == t2);
system.out.println(t3 == t4);
輸出結果是false,true。
原因是:對於在-128~127之間的數,integer使用的是內部快取值,在此範圍之外的數,integer會在堆上建立物件。t1和t2是堆上的不同物件,所以引用不相等。而t3和t4是內部快取的值,引用相等。
顯式new出來的integer物件,必然會在堆上建立物件,其引用是不同的。對於hashmap的key,如果是基本資料型別,則直接進行值的比較。而如果是引用型別呢?integer和int進行==比較時,會自動拆箱進行值的比較。
hashmap底層是用陣列和鍊錶儲存的,當鍊表長度超過8時會轉化為紅黑樹。根據key進行查詢時,先根據hashcode找到陣列上的位置,如果該位置上有多個元素,則繼續通過equals方法判斷值是否相等。
當兩個複雜物件作為map的key相等時,必然先要保證hashcode相同,其次equals也要為true。也就是說,使用複雜物件作為map的key時,需要重寫hashcode和queals方法。
如果只重寫hashcode方法不重寫equals方法,則預設的equals方法會進行記憶體位址的比較,必然是不同的。如果不重寫hashcode方法而僅僅重寫equals方法,則首先陣列上的位置就不同(當然,發生雜湊碰撞時例外),物件自然不會相同。
看下面的例子:
public static class student
public student(string name, string id)
public string getname()
public void setname(string name)
public string getid()
public void setid(string id)
}public static void main(string args) throws exception
輸出為2。
在這個例子中,map中放入student型別物件作為key,如果不重寫比較方法的話,放入的物件是不同的(預設的比較方法繼承於object類,比較的是記憶體位址)。
對student類的比較方法進行重寫:
public static class student
public student(string name, string id)
public string getname()
public void setname(string name)
public string getid()
public void setid(string id)
@override
public int hashcode()
@override
public boolean equals(object o)
student s = (student) o;
return objects.equals(id, s.getid()) && objects.equals(name, s.getname());
}}public static void main(string args) throws exception
輸出為1,說明stu2和stu1相同,新增元素的key相同時,後者覆蓋了前者。
還可以用apache commons lang中的api來實現重寫:
@override
public int hashcode()
@override
public boolean equals(object o)
student s = (student) o;
}
C 相等比較
c 中的物件都繼承自system.object物件,分為引用型別和值型別兩種,所以物件的相等比較而言就分兩種,一種是比較引用,一種是比較值。system.object預設提供了三個方法來進行物件的相等比較 靜態的referenceequals equals 靜態方法 equals 虛方法 子類可以去...
C 之相等比較(常規比較)
c 之相等比較 c 中的物件都繼承自system.object物件,分為引用型別和值型別兩種,所以物件的相等比較而言就分兩種,一種是比較引用,一種是比較值。system.object預設提供了三個方法來進行物件的相等比較 靜態的referenceequals 和equals 的兩個版本,加上 運算子...
js原始值與物件的相等比較
lang en charset utf 8 name viewport content width device width,initial scale 1.0 原始值與物件的相等比較title head let a let b 0 1 console.log a 0 true 2 console....