物件相等比較

2021-09-12 05:47:45 字數 2369 閱讀 4015

對於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物件,必然會在堆上建立物件,其引用是不同的。

integer和int進行==比較時,會自動拆箱進行值的比較。

對於hashmap的key,如果是基本資料型別,則直接進行值的比較。而如果是引用型別呢?

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....