publicclass testset
}
false說明:程式中,book集合兩次新增的字串物件明顯不是乙個物件(程式通過new關鍵字來建立字串物件),當使用==運算子判斷返回false,使用equals方法比較返回true,所以不能新增到set集合中,最後只能輸出乙個元素。[struts2權威指南]
set介面中的知識,同時也適用於hashset、treeset和enumset三個實現類。
hashset按hash演算法來儲存集合的元素,因此具有很好的訪問和查詢效能。
hashset的特點:hashset集合判斷兩個元素相等的標準是兩個物件通過equals方法比較相等,並且兩個物件的hashcode()方法返回值也相等。(1)hashset不是同步的,多個執行緒訪問是需要通過**保證同步
(2)集合元素值可以使null。
//類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演算法的功能:繼續深入研究hashset:它能保證通過乙個物件快速查詢到另乙個物件。hash演算法的價值在於速度,它可以保證查詢得到快速執行。
當需要查詢集合中某個元素時,hash演算法可以直接根據該元素的值得到該元素儲存位置,從而可以讓程式快速找到該元素。
當從hashset中訪問元素時,hashset先計算該元素的hashcode值(也就是呼叫該物件的hashcode())方法的返回值),然後直接到該hashcode對應的位置去取出該元素。
即也是快速的原因。hashset中每個能儲存元素的「曹位(slot)」通常稱為「桶(bucket)」,如果多個元素的hashcode相同,但它們通過equals()方法比較返回false,就需要乙個「桶」裡放多個元素,從而導致效能下降。
當向hashset中新增乙個可變物件後,並且後面程式修改了該可變物件的屬性,可能導致它與集合中其他元素相同,這就可能導致hashset中包含兩個相同的物件。
看下面程式:
class rpublic string tostring()
public
boolean equals(object obj)
}return
false;
} public
int hashcode() }
public
class testhashset2
}
程式執行結果:說明:程式重寫了r類的equals()和hashcode()方法,這兩個方法都是根據r物件的count屬性來判斷。從執行結果可以看出,hashset集合中有完全相同元素,這表明兩個元素已經重複,但因為hashset在新增它們時已經把它們新增到了不同地方,所以hashset完全可以容納兩個相同元素。至於第乙個count為-3的r物件,它儲存在count為5的r物件對應的位置(位址)。當向hashset中新增可變物件時,必須十分小心。如果修改hashset集合中的物件,有可能導致該物件與集合中其他物件相等,從而導致hashset無法準確訪問該物件。[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
hashset還有乙個子類linkedhashset,linkedhashset集合也根據元素hashcode值來決定元素儲存位置,但它同時使用鍊錶維護元素的次序,即當遍歷linkedhashset集合元素時,hashset將會按元素的新增順序來訪問集合裡的元素。
treeset是sortedset介面的唯一實現,treeset可以確保集合元素處於排序狀態(元素是有序的)。
treeset提供的幾個額外方法:
comparator comparator(): 返回當前set使用的comparator,或者返回null,表示以自然方式排序。說明:由執行結果可以看出,treeset並不是根據元素的插入順序進行排序,而是根據元素實際值來進行排序。treeset採用紅黑樹的資料結構對元素進行排序,具體排序內容會在後續文章中說明。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的元素組成。
publicclass testtreesetcommon
}
程式執行結果:
[-9, 2, 5, 10]
-9 10
[-9, 2]
[5, 10]
[2]
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...