Java集合框架總結(2) Set介面的使用

2021-06-29 09:03:08 字數 3622 閱讀 7326

public

class testset

}

false 

[struts2權威指南]

說明:程式中,book集合兩次新增的字串物件明顯不是乙個物件(程式通過new關鍵字來建立字串物件),當使用==運算子判斷返回false,使用equals方法比較返回true,所以不能新增到set集合中,最後只能輸出乙個元素。

set介面中的知識,同時也適用於hashset、treeset和enumset三個實現類。

hashset按hash演算法來儲存集合的元素,因此具有很好的訪問和查詢效能。

hashset的特點:

(1)hashset不是同步的,多個執行緒訪問是需要通過**保證同步

(2)集合元素值可以使null。

hashset集合判斷兩個元素相等的標準是兩個物件通過equals方法比較相等,並且兩個物件的hashcode()方法返回值也相等。

//

類a的equals方法總是返回true,但沒有重寫其hashcode()方法

class a}//

類b的hashcode()方法總是返回1,但沒有重寫其equals()方法

class b}//

類c的hashcode()方法總是返回2,並重寫其equals()方法

class c

public

boolean equals(object obj)

}public

class testhashset

}

程式執行結果:

[b@1, 

b@1, 

c@2 , 

a@b5dac4

, a@9945ce

]

說明:(1)object類提供的tostring方法總是返回該物件實現類的類名

+@+hashcode(16進製制數)值,所以可以看到上面程式輸出的結果。可以通過重寫tostring方法來輸出自己希望的形式。

(2)即使2個a物件通過equals比較返回true,但hashset依然把它們當成2個物件;即使2個b物件的hashcode()返回相同值,但hashset依然把它們當成2個物件。即如果把乙個物件放入hashset中時,如果重寫該物件equals()方法,也應該重寫其hashcode()方法。其規則是:如果2個物件通過equals方法比較返回true時,這兩個物件的hashcode也應該相同。

hash演算法的功能:

它能保證通過乙個物件快速查詢到另乙個物件。hash演算法的價值在於速度,它可以保證查詢得到快速執行。

當需要查詢集合中某個元素時,hash演算法可以直接根據該元素的值得到該元素儲存位置,從而可以讓程式快速找到該元素。

當從hashset中訪問元素時,hashset先計算該元素的hashcode值(也就是呼叫該物件的hashcode())方法的返回值),然後直接到該hashcode對應的位置去取出該元素。

即也是快速的原因。hashset中每個能儲存元素的「曹位(slot)」通常稱為「桶(bucket)」,如果多個元素的hashcode相同,但它們通過equals()方法比較返回false,就需要乙個「桶」裡放多個元素,從而導致效能下降。

繼續深入研究hashset:

當向hashset中新增乙個可變物件後,並且後面程式修改了該可變物件的屬性,可能導致它與集合中其他元素相同,這就可能導致hashset中包含兩個相同的物件。

看下面程式:

class r

public string tostring()

public

boolean equals(object obj)

}return

false;

} public

int hashcode() }

public

class testhashset2

}

程式執行結果:

[r(count屬性:5), r(count屬性:9), r(count屬性:-3), r(count屬性:-2)] 

[r(count屬性:-3), r(count屬性:9), r(count屬性:-3), r(count屬性:-2)] 

[r(count屬性:-3), r(count屬性:9), r(count屬性:-2)] 

hs是否包含count為-3的r物件?false 

hs是否包含count為5的r物件?false

說明:程式重寫了r類的equals()和hashcode()方法,這兩個方法都是根據r物件的count屬性來判斷。從執行結果可以看出,hashset集合中有完全相同元素,這表明兩個元素已經重複,但因為hashset在新增它們時已經把它們新增到了不同地方,所以hashset完全可以容納兩個相同元素。至於第乙個count為-3的r物件,它儲存在count為5的r物件對應的位置(位址)。當向hashset中新增可變物件時,必須十分小心。如果修改hashset集合中的物件,有可能導致該物件與集合中其他物件相等,從而導致hashset無法準確訪問該物件。

hashset還有乙個子類linkedhashset,linkedhashset集合也根據元素hashcode值來決定元素儲存位置,但它同時使用鍊錶維護元素的次序,即當遍歷linkedhashset集合元素時,hashset將會按元素的新增順序來訪問集合裡的元素。

treeset是sortedset介面的唯一實現,treeset可以確保集合元素處於排序狀態(元素是有序的)。

treeset提供的幾個額外方法:

comparator comparator(): 返回當前set使用的comparator,或者返回null,表示以自然方式排序。

object first():返回集合中的第乙個元素。

object last():返回集合中的最後乙個元素。

objiect lower(object e):返回集合中位於指定元素之前的元素(即小於指定元素的最大元素,參考元素可以不是treeset的元素)。

object higher(object e):返回集合中位於指定元素之後的元素(即大於指定元素的最小元素,參考元素可以不需要treeset的元素)。

sortedset subset(fromelement, toelement):返回此set的子集,範圍從fromelement(包含大於等於)到toelement(不包含小於)。

sortedset headset(toelement):返回此set的子集,由小於toelement的元素組成。

sortedset tailset(fromelement):返回此set的子集,由大於或等於fromelement的元素組成。

public

class testtreesetcommon

}

程式執行結果:

[-9, 2, 5, 10] 

-9 10 

[-9, 2] 

[5, 10] 

[2]

說明:由執行結果可以看出,treeset並不是根據元素的插入順序進行排序,而是根據元素實際值來進行排序。treeset採用紅黑樹的資料結構對元素進行排序,具體排序內容會在後續文章中說明。

Java集合框架總結(2) Set介面的使用

public class testset false struts2權威指南 說明 程式中,book集合兩次新增的字串物件明顯不是乙個物件 程式通過new關鍵字來建立字串物件 當使用 運算子判斷返回false,使用equals方法比較返回true,所以不能新增到set集合中,最後只能輸出乙個元素。s...

Java集合框架總結(2) Set介面的使用

public class testset false struts2權威指南 說明 程式中,book集合兩次新增的字串物件明顯不是乙個物件 程式通過new關鍵字來建立字串物件 當使用 運算子判斷返回false,使用equals方法比較返回true,所以不能新增到set集合中,最後只能輸出乙個元素。s...

Java集合框架總結(2) Set介面的使用

public class testset false struts2權威指南 說明 程式中,book集合兩次新增的字串物件明顯不是乙個物件 程式通過new關鍵字來建立字串物件 當使用 運算子判斷返回false,使用equals方法比較返回true,所以不能新增到set集合中,最後只能輸出乙個元素。s...