Day10-Java进阶-泛型&数据结构(树)&TreeSet 集合

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 T

            E : Element
            T : Type
            K : 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>{

    @Override
    public void show(String s) {

    }
}

class InterBIml<E> implements Inter<E>{

    @Override
    public 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{

    @Override
    public void work() {
        System.out.println("程序员写代码...");
    }
}

class Manager extends Employee{

    @Override
    public 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 降序
    @Override
    public 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 : 只有王五,25
                1 : 正序排列
                -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>() {
            @Override
            public 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>() {
            @Override
            public 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);
    }
}
相关推荐
Scott9999HH5 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔5 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海6 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区9 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大10 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai10 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说10 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json