1. 泛型
1.1 泛型介绍
java">package com.itheima.generics;import java.util.ArrayList;
import java.util.Iterator;public class GenericsDemo1 {/*泛型介绍 : JDK5引入的, 可以在编译阶段约束操作的数据类型, 并进行检查注意 : 泛型默认的类型是Object, 且只能接引用数据类型泛型的好处:1. 统一数据类型2. 将运行期的错误提升到了编译期泛型的学习路径:1. 泛型类2. 泛型方法3. 泛型接口4. 泛型通配符5. 泛型的限定*/public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");Iterator it = list.iterator();while (it.hasNext()) {Object o = it.next();String s = (String) o;System.out.println(s.length());}}
}
1.2 泛型类
java">package com.itheima.generics;import java.util.ArrayList;public class GenericsDemo2 {/*常见的泛型标识符 : E V K TE : ElementT : TypeK : Key(键)V : Value(值)清楚不同的泛型, 在什么时机能确定到具体的类型泛型类 : 创建对象的时候*/public static void main(String[] args) {Student<Integer> stu = new Student<>();}
}class Student<E> {private E e;public E getE() {return e;}public void setE(E e) {this.e = e;}
}
1.3 泛型方法
java">package com.itheima.generics;public class GenericsDemo3 {/*泛型方法1. 非静态的方法 : 内部的泛型, 会根据类的泛型去匹配2. 静态的方法 : 静态方法中如果加入了泛型, 必须声明出自己独立的泛型- 时机: 在调用方法, 传入实际参数的时候, 确定到具体的类型*/public static void main(String[] args) {String[] arr1 = {"张三", "李四", "王五"};Integer[] arr2 = {11, 22, 33};Double[] arr3 = {11.1, 22.2, 33.3};printArray(arr1);printArray(arr2);printArray(arr3);}public static <T> void printArray(T[] arr) {System.out.print("[");for (int i = 0; i < arr.length - 1; i++) {System.out.print(arr[i] + ", ");}System.out.println(arr[arr.length - 1] + "]");}
}
1.4 泛型接口
java">package com.itheima.generics;import java.util.ArrayList;
import java.util.List;public class GenericsDemo4 {/*泛型接口1. 实现类, 实现接口的时候确定到具体的泛型2. 实现类实现接口, 没有指定具体类型, 就让接口的泛型, 跟着类的泛型去匹配*/public static void main(String[] args) {InterBIml<String> i = new InterBIml<>();}
}interface Inter<E> {void show(E s);
}class InterAIml implements Inter<String>{@Overridepublic void show(String s) {}
}class InterBIml<E> implements Inter<E>{@Overridepublic void show(E e) {}
}
1.5 泛型通配符
java">package com.itheima.generics;import java.util.ArrayList;public class GenericsDemo5 {/*泛型通配符? : 任意类型? extends E : 可以传入的是E, 或者是E的子类? super E : 可以传入的是E, 或者是E的父类*/public static void main(String[] args) {ArrayList<Coder> list1 = new ArrayList<>();list1.add(new Coder());ArrayList<Manager> list2 = new ArrayList<>();list2.add(new Manager());ArrayList<String> list3 = new ArrayList<>();list3.add("abc");ArrayList<Object> list4 = new ArrayList<>();list4.add("aaa");//method(list1); // 编译错误//method(list2); // 编译错误//method(list3); // 编译错误method(list4); // 编译正常}// 可以传入Employee及其子类public static void method(ArrayList<? super Employee> list){for (Object o : list) {Employee e = (Employee) o;e.work();}}}abstract class Employee{private String name;private double salary;public Employee() {}public Employee(String name, double salary) {this.name = name;this.salary = salary;}public abstract void work();/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return salary*/public double getSalary() {return salary;}/*** 设置* @param salary*/public void setSalary(double salary) {this.salary = salary;}public String toString() {return "Employee{name = " + name + ", salary = " + salary + "}";}
}class Coder extends Employee{@Overridepublic void work() {System.out.println("程序员写代码...");}
}class Manager extends Employee{@Overridepublic void work() {System.out.println("项目经理分配任务...");}
}
2. 数据结构(树)
2.1 树的介绍
2.1 平衡二叉树
2.1.1 左旋
2.1.2 右旋
2.1.3 左左旋
2.1.4 左右旋
2.1.5 右右旋
2.1.6 右左旋
2.2 红黑树
当每次添加节点的颜色是黑色
当每次添加节点的颜色是红色
3. TreeSet 集合
3.1 TreeSet 集合元素排序介绍
java">package com.itheima.set;import java.util.TreeSet;public class TreeSetDemo1 {/*TreeSet集合的特点体验 : 排序, 去重*/public static void main(String[] args) {TreeSet<String> ts = new TreeSet<>();ts.add("a");ts.add("d");ts.add("e");ts.add("c");ts.add("b");ts.add("b");ts.add("b");System.out.println(ts);}
}
以下以返回值全为 -1 (倒序排序为例)
3.2 TreeSet 排序 (自然排序)
java">package com.itheima.domain;public class Student implements Comparable<Student>{// this.xxx - o.xxx 正序// o.xxx - this.xxx 降序@Overridepublic int compareTo(Student o) {// 根据年龄做主要排序条件int ageResult = this.age - o.age;// 根据姓名做次要排序条件int nameResult = ageResult == 0 ? o.name.compareTo(this.name) : ageResult;// 判断姓名是否相同int result = nameResult == 0 ? 1 : nameResult;return result;}private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}}
java">package com.itheima.set;import com.itheima.domain.Student;import java.util.TreeSet;public class TreeSetDemo2 {/*TreeSet集合存储Student学生对象compareTo 方法的返回值 :0 : 只有王五,251 : 正序排列-1 : 倒序排序*/public static void main(String[] args) {TreeSet<Student> ts = new TreeSet<Student>();ts.add(new Student("王五", 25));ts.add(new Student("王五", 25));ts.add(new Student("王五", 25));ts.add(new Student("王五", 25));System.out.println(ts);}
}
3.3 TreeSet 排序 (比较器排序)
java">package com.itheima.set;import com.itheima.domain.Student;import java.util.Comparator;
import java.util.TreeSet;public class TreeSetDemo3 {/*如果同时具备比较器和自然排序, 会优先按照比较器的规则, 进行排序操作.*/public static void main(String[] args) {TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {int ageResult = o1.getAge() - o2.getAge();return ageResult == 0 ? o1.getName().compareTo(o2.getName()) : ageResult;}});ts.add(new Student("赵六", 26));ts.add(new Student("李四", 24));ts.add(new Student("张三", 23));ts.add(new Student("王五", 25));System.out.println(ts);}
}
java">package com.itheima.set;import java.util.Comparator;
import java.util.TreeSet;public class TreeSetDemo4 {public static void main(String[] args) {TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o2.length() - o1.length();}});ts.add("aa");ts.add("aaaaaaaa");ts.add("aaa");ts.add("a");System.out.println(ts);}
}