## HashSet
? ? 1. 添加元素的時候,每一次都會調(diào)用hashCode方法
? ? 2. 重寫equals方法和HashCode方法,也是首先調(diào)用hashCode方法,再來調(diào)用equals方法
? ? HashSet存儲原理:【背下來!??!】
? ? 向HashSet集合中添加元素,HashSet首先會調(diào)用該元素hashCode方法,獲取該對象的Hash值
? ? 通過【移位】運算,計算出,該元素應(yīng)該保存在【哈希表】中哪一個位置
? ? 情況1:
? ? 該位置沒有任何元素,直接放入
? ? 情況2:
? ? 該位置存在其他元素,哈希表就會調(diào)用該元素的equals方法,和已經(jīng)保存在哈希表里面的元素進行
? ? 比較
? ? 如果比較結(jié)果為true 表示相同元素,無法添加
? ? 如果比較結(jié)果為false,表示為不同元素,可以添加
? ? 哈希表的每一個單元格都是一個桶式結(jié)構(gòu),可以保存多個元素,允許元素共存?。?!
##? TreeSet
? ? TreeSet是一個樹形結(jié)構(gòu)的Set結(jié)構(gòu)
發(fā)現(xiàn):
TreeSet中添加元素原本是字符串類型,當(dāng)添加自定義對象,或者數(shù)字的時候,報異常!??!
ClassCastException
原因:
因為TreeSet是一個樹形結(jié)構(gòu),所有的元素都需要進行比較之后才可以放入到Set集合中,而
字符串和自定義類對象是沒有比較的方式和方法的
【要求】在TreeSet里面的所有的元素都要有【比較的方式】或者有【自然順序】
TreeSet添加自定義元素的方式:
方式1:
讓這個自定義類【遵從】Comparable接口,實現(xiàn)compareTo方法
方式2:
自定義比較器,這個比較器是【遵從】Comparator接口,實現(xiàn)
int compare(Object o1, Object o2)
可以在創(chuàng)建TreeSet對象的時候,傳入比較器對象作為比較方式