一、泛型(JDK5引入)
1、基本概念
在編譯階段約束操作的數據類型,并進行檢查
好處:統一數據類型,將運行期的錯誤提升到了編譯期
泛型的默認類型是 Object
2、泛型類
在創建類的時候寫上泛型
在創建具體對象的時候確定類型
E:Element
T:Type
K:Key
V:Value
public class GenericsDemo {public static void main(String[] args) {Student<String> stu1 = new Student<>("aaa", "1");}
}class Student<E> {private E name;private E id;public Student() {}public Student(E name, E id) {this.name = name;this.id = id;}public E getName() {return name;}public void setName(E name) {this.name = name;}public E getId() {return id;}public void setId(E id) {this.id = id;}public String toString() {return "Student{name = " + name + ", id = " + id + "}";}
}
3、泛型方法
(1)非靜態方法:其泛型會根據類的泛型進行匹配,如上面的 getName()、getId() 方法
(2)靜態方法:要聲明出自己獨立的泛型,在調用方法傳參時確定實際的類型
public class GenericsDemo {public static void main(String[] args) {String[] arr1 = {"aaa", "ccc", "bbb"};Integer[] arr2 = {1, 2, 3};Double[] arr3 = {1.1, 2.2, 3.3};printArray(arr1);printArray(arr2);printArray(arr3);}public static<T> void printArray(T[] arr) {for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}
4、泛型接口
(1)可以在實現類實現接口時確定類型
(2)也可以讓實現類繼續使用泛型,在創建實現類對象時確定類型
5、泛型通配符
public static void func1(ArrayList<?> list) {}
public static void func2(ArrayList<? extends E> list) {}
public static void func3(ArrayList<? super E> list) {}? 表示 可以是任意類型
? extends E 表示 可以是E或E的子類
? super E 表示 可以是E或E的父類
二、紅黑樹
1、簡介
紅黑樹是一種自平衡的二叉查找樹,是計算機科學中用到的一種數據結構
它是一種特殊的二叉查找樹,紅黑樹的每一個節點上都有存儲位表示節點的顏色
每一個節點可以是紅或者黑;紅黑樹不是高度平衡的,它的平衡是通過"紅黑規則"進行實現的
2、紅黑規則
(1)顏色屬性:每個節點非紅即黑
(2)根屬性:根節點必須為黑色
(3)葉子屬性:所有葉子節點(NIL節點,空節點)均為黑色
(4)紅色節點約束:紅色節點的子節點必須為黑色(即不存在連續的紅節點)
(5)黑高一致性:從任意節點到其所有葉子節點的路徑中,包含的黑色節點數量相同
3、添加節點
節點默認是紅色
三、TreeSet 集合
1、作用
對集合中的元素進行排序、去重操作(底層由紅黑樹實現)
2、兩種排序方式
(1)自然排序
類實現Comparable 接口,想和哪個類作比較,泛型就寫哪個類
重寫compareTo 方法
根據方法的返回值來組織排序規則
compare方法,返回負值則節點往左,正值則節點往右,0則不存
TreeSet 集合的add 方法會自動調用 compareTo 方法
TreeSet<Worker> st = new TreeSet<>();
st.add(new Worker("aa", 30));
st.add(new Worker("bb", 33));
st.add(new Worker("cc", 31));
st.add(new Worker("dd", 32));
System.out.println(st);
// 默認是中序遍歷(左根右)
// 按 id 升序排列class Worker implements Comparable<Worker>{String name;int id;@Overridepublic int compareTo(Worker o) {return this.id - o.id;}
}
(2)比較器排序
在 TreeSet 的構造方法中,傳入 Compartor 接口的實現類對象
重寫 compare 方法
根據方法的返回值, 來組織排序規則
比較器排序的優先級高于自然排序
Java已經寫好的類大多有自然排序規則,可以用比較器對其進行覆蓋
TreeSet<Worker> st = new TreeSet<>(new Comparator<Worker>() {@Overridepublic int compare(Worker o1, Worker o2) {return o1.getId() - o2.getId(); }
});
// 可以用 Lambda 表達式