Set
Set集合概述和特點
-
不可以存儲重復元素
-
沒有索引,不能使用普通for循環遍歷
哈希值
-
哈希值簡介
是JDK根據對象的地址或者字符串或者數字算出來的int類型的數值
-
如何獲取哈希值
Object類中的public int hashCode():返回對象的哈希碼值。
-
哈希值的特點
-
同一個對象多次調用hashCode()方法返回的哈希值是相同的。
-
默認情況下,不同對象的哈希值是不同的,因為默認情況下是用對象的地址值來算出哈希值的。而重寫hashCode()方法,可以實現讓屬性相同的的不同對象哈希值相同。
-
哈希表
-
JDK8以前:數組+鏈表
-
JDK8開始:數組+鏈表+紅黑樹
HashSet的底層(基于哈希表)
自定義類中重寫hashcode與equals方法的理由:如果不重寫則在把數據存入HashSet中時hashcode與equals比較的是數據的地址值,所以如果不重寫,每個數據都能存入HashSet。違反了set的設計初衷。
LinkedHashSet的特點和原理
-
有序、不重復、無索引
-
底層基于哈希表,使用時多了一個雙鏈表記錄添加順序(就是比HashSet多了一個雙鏈表)
TreeSet集合
-
不可以存儲重復元素
-
沒有索引
-
可以將元素按照規則進行排序
-
TreeSet():根據其元素的自然排序進行排序
-
TreeSet(Comparator comparator) :根據指定的比較器進行排序
-
當比較器與自然排序共存的時候,使用比較器進行排序
-
兩種比較方式
-
自然排序:在<>括號里的類中實現Comparable接口,重寫compareTo方法(接口中的抽象方法),根據返回值進行排序
-
@Overridepublic int compareTo(Student o) {//按照對象的年齡進行排序//主要判斷條件: 按照年齡從小到大排序int result = this.age - o.age;//次要判斷條件: 年齡相同時,按照姓名的字母順序排序result = result == 0 ? this.name.compareTo(o.getName()) : result;return result;}
-
比較器排序: 創建TreeSet對象的時候傳遞Comparator的實現類對象,重寫compare方法,根據返回值進行排序
TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {@Overridepublic int compare(Teacher o1, Teacher o2) {//o1表示現在要存入的那個元素//o2表示已經存入到集合中的元素//主要條件int result = o1.getAge() - o2.getAge();//次要條件result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;return result;}});
-
在使用的時候,默認使用自然排序,當自然排序不滿足現在的需求時,必須使用比較器排序
-
-
兩種方式中關于返回值的規則
-
如果返回值為負數,表示當前存入的元素是較小值,存左邊
-
如果返回值為0,表示當前存入的元素跟集合中元素重復了,不存
-
如果返回值為正數,表示當前存入的元素是較大值,存右邊
-
-
自然排序相比比較器排序的弊端:
當泛型<>括號中的時Interge或者String…時,無法在Interge或者String中重寫compareTo方法,除非你修改源碼,
所以,此時只能用比較器排序進行排序。
-