Set接口概述
一個不包含重複元素的Collection
Set案例
存儲字符串並遍歷
存儲自定義對象並遍歷
HashSet類概述
- 不保證set的迭代順序
- 特別是它不保證該順序恆久不變
HashSet如何保證元素唯一性?
- 底層樹結構是哈希表(元素是鏈表的數組)
- 哈希表依賴於哈希值存儲
- 添加功能底層以來的兩個方法
- int hashCode()
- boolean equals(Object obj)
哈希表:是一個元素爲鏈表的數組。綜合了數組和鏈表的好處(新華字典)
如果對象的哈希值相同了,就會走equals()方法比較變量是否相同,如果不同,添加到集合,相同就不添加
“桶”結構-------(同一頁新華字典,可以有相同拼音的漢字很多個)
優化代碼:讓對象的哈希值儘可能的不同
哈希值和哪些內容相關呢?
和對象的成員變量值相關
所以,最終解決方案:把對象的成員變量值進行相加
如果是基本類型,直接加值
如果是引用類型,加哈希值
爲了進一步區分,把他們乘一些整數
LinkedHashSet
具有可預知的迭代順序的Set接口的哈希表和鏈表實現
LinkedHashSet:底層數據結構由哈希表和鏈表組成
哈希表保證元素的唯一性
鏈表保證元素有序(存儲和取出順序一致)
TreeSet
基於TreeMap的NavigableSet實現,使用元素的自然熟悉怒對元素進行排序,或者根據創建set時提供的Comparator進行排序,具體取決於使用的構造方法
概述:
- 使用元素的自然順序對元素進行排序
- 根據創建set時提供的Comparator進行排序
- 具體取決於使用的構造方法
TreeSet是如何保證元素的排序和唯一性的?
- 底層數據結構是紅黑樹(紅黑樹是一種自平衡的二叉樹)
1、登錄註冊案例(理解)
2、Set集合(理解)
- set集合的特點:無序,唯一
- HashSet集合(掌握)
- 底層數據結構是哈希表(是一個元素爲鏈表的數組)
- 哈希表底層依賴兩個方法
- hashCode()
- equals()
執行順序:
首先比較哈希值是否相同
相同:繼續執行equals方法
返回true
返回false
不同:直接把元素添加到集合
c.如何保證元素唯一性的呢?
由這兩個方法保證
d.開發的時候代碼自動生成即可
- HashSet存儲字符串並遍歷
- HashSet存儲自定義對象並遍歷(對象成員變量值相同即爲同一個元素)
- TreeSet集合
- 底層數據結構是紅黑樹(一個自平衡二叉樹)
- 保證元素排序的方式
- 自然排序(元素具備比較性)
- 讓元素所屬的類實現Comparable接口
- 比較器排序(集合具備比較性)
- 讓集合構造方法接受Comparator的實現類對象
- 自然排序(元素具備比較性)
- 講過的代碼看一遍
4.案例:
- 獲取無重複的隨機數
- 鍵盤錄入學生按照總分從高到低輸出