day10-集合

news2024/12/24 8:45:20

day10 集合

1.集合概述

1.1为什么要用集合?

当我们在实现购物车功能时,可能需要随时添加新商品对象进来(个数不确定) ,也随时可能删除商品对象,这个时候之前学习的数组不满足我们的需求

在这里插入图片描述

1.2 什么是集合?

集合与数组类似,也是一种容器,用于装数据。

在这里插入图片描述

数组定义完成并启动后,类型确定、长度固定

问题:在个数不能确定,且要进行增删数据操作的时候,数组是不太合适的。

1.3 集合的特点

在这里插入图片描述

集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合更像气球。

集合非常适合做元素个数不确定,且要进行增删操作的业务场景。
集合还停工了许多丰富好用的功能,而数组的功能比较单一

1.4 总结

1、数组和集合的元素存储的个数问题。

数组定义后类型确定,长度固定

集合类型可以不固定,大小是可变的。

2、数组和集合存储元素的类型问题

数组可以存储基本类型和引用类型的数据。

集合只能存储引用数据类型的数据。

3、数组和集合适合的场景

数组适合做数据个数和类型确定的场景。

集合适合做数据个数不确定,且要做增删元素的场景。

2.集合类ArrayList

2.1集合类ArrayList介绍

ArrayList简单介绍

Arraylist代表的是集合类,集合是一种容器,与数组类似,不同的是集合的大小是不固定的

通过创建ArrayList的对象表示得到一个集合容器,同时ArayList提供了此数组更好用,更丰富的API(功能)给程序员使用

2.2 ArrayList的创建和使用

在这里插入图片描述

2.3 ArrayList总结

ArrayList类如何创建集合对象,如何添加元素?

ArrayList list = new ArrayList();
public boolean add(E e)
publiv void add(int index,E element)

2.4 泛型概述

**需求:**在这个地方我们可以看到 我们可以往集合中存入任意类型的元素,那我们如何限定存入的元素呢?

ArrayList:其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据类型。

举例:

ArrayList:此集合只能操作字符串类型的元素

ArrayList:此集合只能操作整数类型的元素

ArrayList<自定义类>:此集合只能操作自定的类中的元素

注意:集合中只能存储引用类型,不支持基本数据类型。

2.5 泛型总结

1、怎么去统—ArrayList集合操作的元素类型?
•使用泛型:<数据类型>
• ArrayList list1 = new ArrayList);

2.6 ArrayList集合常用方法

在这里插入图片描述

2.7 案例练习

1.遍历并删除元素值。

在这里插入图片描述

代码演示:

public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(98);
        arrayList.add(77);
        arrayList.add(66);
        arrayList.add(89);
        arrayList.add(79);
        arrayList.add(50);
        arrayList.add(100);

//        for (int i = 0; i < arrayList.size(); i++) {
//            if (arrayList.get(i) < 80) {
//                arrayList.remove(arrayList.get(i));
//            }
//        }
        //出现问题 !:从前往后删除的时候 每删除掉一个索引处的值,集合长度可变 集合往前移动 会出现问题。
        for (int i = arrayList.size() - 1; i >= 0; i--) {
            if (arrayList.get(i) < 80) {
                arrayList.remove(arrayList.get(i));
            }
        }
        System.out.println(arrayList);
    }

在这里插入图片描述

2.影片信息在程序中的表示

在这里插入图片描述

代码演示:

电影类Movie

public class Movie {
    private String movieName;//电影名称
    private String actor;//主演
    private String director;//导演
    private Double score;

    public Movie() {
    }

    public Movie(String movieName, String actor, String director, Double score) {
        this.movieName = movieName;
        this.actor = actor;
        this.director = director;
        this.score = score;
    }

    public String getMovieName() {
        return movieName;
    }

    public void setMovieName(String movieName) {
        this.movieName = movieName;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    public String getDirector() {
        return director;
    }

    public void setDirector(String director) {
        this.director = director;
    }

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }

//    @Override
//    public String toString() {
//        return "Movie{" +
//                "movieName='" + movieName + '\'' +
//                ", actor='" + actor + '\'' +
//                ", director='" + director + '\'' +
//                ", score=" + score +
//                '}';
//    }
}

测试类:

 public static void main(String[] args) {
//分析
//①	:三部电影是3个对象,定义一个电影类,定义一个集合存储电影对象。
        ArrayList<Movie> arrayList = new ArrayList<>();
//②	:创建3个电影对象,封装相关数据,把3个对象存入到集合中去。
        Movie m1 = new Movie("肖申克的救赎","蒂姆罗宾斯","杨导",9.9);
        Movie m2 = new Movie("流浪地球","吴京","未知",9.8);
        Movie m3 = new Movie("复仇者联盟4","神龙李青","罗伯特兄嘚",9.7);
        arrayList.add(m1);
        arrayList.add(m2);
        arrayList.add(m3);
        System.out.println(arrayList);//[com.itgaohe.arrayListAPI.Movie@4554617c, cn.bdqn.arrayListAPI.Movie@74a14482, cn.bdqn.arrayListAPI.Movie@1540e19d]
//③	:遍历集合中的3个对象,输出相关信息。
        for (int i = 0; i < arrayList.size(); i++) {
            Movie movie = arrayList.get(i);
            System.out.println("电影名:" + movie.getMovieName());
            System.out.println("演员名:" + movie.getActor());
            System.out.println("导演名:" + movie.getDirector());
            System.out.println("电影评分:" + movie.getScore());
        }
    }

3.学生信息系统的数据搜索在这里插入图片描述

代码演示:

Student

public class Student {
    private int number;
    private String name;
    private int age;
    private String className;
    public Student() {
    }

    public Student(int number, String name, int age, String className) {
        this.number = number;
        this.name = name;
        this.age = age;
        this.className = className;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }
}

测试类

  public static void main(String[] args) {
        //定义ArrayList集合存储学生数据
        // ①   定义Student类,定义ArrayList集合存储如上学生对象信息,并遍历展示出来
        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(new Student(20180302, "刁子熙", 88, "保健一班"));
        arrayList.add(new Student(20180303, "东方不败", 56, "推拿二班"));
        arrayList.add(new Student(20180304, "西门吹雪", 40, "288班"));
        arrayList.add(new Student(20180305, "天山童姥", 68, "精神人班"));
        for (int i = 0; i < arrayList.size(); i++) {
            Student student = arrayList.get(i);
            System.out.println(student.getNumber() + "," + student.getName() + "," + student.getAge() + "," + student.getClassName());
        }

//        定义扫描器 扫描数据
        Scanner sc = new Scanner(System.in);
        //使用死循环,让用户可以不停的搜索
        while (true) {
            System.out.println("请输入学生的学号:");
            int number = sc.nextInt();
            //调用查询方法 返回学生对象
            Student student = getStudentByNumber(arrayList, number);
            //比对学生对象 如果学生对象为null 没查到此人
            if (student == null) {
                System.out.println("没查到此人!");
            } else {
                System.out.println("找到了该学生,该学生的信息是" + student.getNumber() + "," + student.getName() + "," + student.getAge() + "," + student.getClassName());
            }
        }
    }

    // ②   提供一个方法,可以接收ArrayList集合,和要搜索的学号,返回搜索到的学生对象信息,并展示。
    public static Student getStudentByNumber(ArrayList<Student> a, int number) {
        for (int i = 0; i < a.size(); i++) {
            Student student = a.get(i);
            //判断 如果学号比对成功 则将对象返回出去
            if (student.getNumber() == number) {
                return student;
            }
        }
        //否则 返回null值
        return null;
    }

2.8 总结ArrayList的方法

在这里插入图片描述

2.9 ArrayList的扩容机制(补充)

在Java中,ArrayList是一个使用非常频繁的集合类型,它的底层是Object数组,所以它拥有数组所拥有的特性,比如支持随机访问,所以查询效率高,但插入数据需要移动元素,所以效率低。

1.ArrayList在调用无参构造方法时创建的是一个长度为0的空数组,当调用add()方法添加元素时,ArrayList才会触发扩容机制

2.调用add()方法添加元素时,ArrayList才会触发扩容机制 长度为10

3.当集合添加的内容超过10的时候 会进行二次扩容 长度为原来的1.5倍 1.5*10=15

4.当进行第三次扩容的时候 1.5*15 = 22.5 ArrayList底层是通过移位操作计算得到的新容量。所以新容量应该等于15 >> 1 + 15 = 22 ArrayList经过第三次扩容后容量为22

5.addAll()方法总是选择扩容一次后的容量与旧容量加上添加的元素个数的容量中取一个最大值作为新的容量,比如:当前ArrayList中有10个元素,而addAll()方法需要添加6个元素,当ArrayList触发扩容后的新容量应该为15,而旧容量加上需要添加的元素容量为16,从中取一个较大值为16,所以新容量应该为16。

2.10 员工管理系统

NumberOutOfBoundsException工号重复异常

//工号重复异常
public class NumberOutOfBoundsException extends RuntimeException{
    public NumberOutOfBoundsException() {
    }

    public NumberOutOfBoundsException(String message) {
        super(message);
    }

    public NumberOutOfBoundsException(String message, Throwable cause) {
        super(message, cause);
    }
}

NameOutOfBoundsException员工编号长度异常

//员工编号长度异常
public class NameOutOfBoundsException extends RuntimeException{
    public NameOutOfBoundsException() {
    }

    public NameOutOfBoundsException(String message) {
        super(message);
    }

    public NameOutOfBoundsException(String message, Throwable cause) {
        super(message, cause);
    }
}

AgeOutOfBoundsException 年龄异常

public class AgeOutOfBoundsException extends RuntimeException{
    public AgeOutOfBoundsException() {
    }

    public AgeOutOfBoundsException(String message) {
        super(message);
    }

    public AgeOutOfBoundsException(String message, Throwable cause) {
        super(message, cause);
    }
}

Employee员工类

public class Employee {
    //    number员工编号:7位
    private int number;
    //    name姓名:2-6
    private String name;
    //    16~35
    private int age;
    private String address;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        String numbers = String.valueOf(number);
        if (numbers.length() == 7) {
            this.number = number;
        } else {
            throw new NameOutOfBoundsException("工号长度不对!");
        }

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name.length() >= 2 && name.length() <= 6) {
            this.name = name;
        } else {
            throw new NameOutOfBoundsException("你输入名字超长了!");
        }
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age >= 16 && age <= 35) {
            this.age = age;
        } else {
            throw new AgeOutOfBoundsException("年龄区间不对!");
        }

    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Employee(int number, String name, int age, String address) {
        this.number = number;
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public Employee() {
    }

    @Override
    public String toString() {
        return "Employee{" +
                "number=" + number +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

测试类:

public class Test {
    public static Scanner sc = new Scanner(System.in);
    public static Employee employee = null;//定义员工对象
    public static ArrayList<Employee> al = new ArrayList<>();//定义存储员工的集合

    public static void main(String[] args) {
        //1.创建扫描器
        Test.show();
        Test.choice();
    }

    public static void show() {
        System.out.println("------欢迎来到公司员工管理系统------");
        System.out.println("请选择你的操作:\n1 添加员工\n2 删除员工\n3 修改员工\n4 查看所有员工\n5 退出");
    }

    public static void choice() {
        int i = 0;
        while (true) {
            try {
                System.out.println("请输入你的选择:");
                //用字符串接收
                String next = sc.next();
                //将string的选择转为int类型
                i = Integer.parseInt(next);
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
            //条件判断输入的选择
            switch (i) {
                case 1:
                    System.out.println("执行添加操作");
                    add();
                    break;
                case 2:
                    System.out.println("执行删除操作");
                    remove();
                    break;
                case 3:
                    System.out.println("执行修改操作");
                    update();
                    break;
                case 4:
                    System.out.println("执行查看操作");
                    select();
                    break;
                case 5:
                    System.out.println("执行退出操作");
                    System.exit(200);
                    break;
                default:
                    System.out.println("你的输入有误 请重新输入!");
                    choice();
                    break;
            }
        }
    }

    //添加
    public static void add() {
        employee = new Employee();
        addNumber();
        addName();
        addAge();
        System.out.println("请输入员工地址:");
        String address = sc.next();
        employee.setAddress(address);

        //将员工对象加入到集合中
        al.add(employee);
        System.out.println("员工对象添加完成!");
        System.out.println(al);
    }

    //添加员工号
    public static void addNumber() {
        while (true) {
            System.out.println("请输入员工编号:");
            try {
                String number1 = sc.next();
                int number = Integer.parseInt(number1);
                //判断一下员工的工号是否重复 如果重复则提示工号重复,需要重新输入工号
                for (int i = 0; i < al.size(); i++) {
                    if (al.get(i).getNumber() == number) {
                        System.out.println("员工编号不能重复!请重新输入!");
                        //递归调用添加方法
                        addNumber();
                    }
                }
                //添加值
                employee.setNumber(number);
                break;
            } catch (NameOutOfBoundsException e) {
                System.out.println("输入的员工编号必须是七位");
                e.printStackTrace();
            } catch (NumberFormatException e) {
                System.out.println("输入的必须是数字");
                e.printStackTrace();
            }

        }
    }

    //添加名字
    public static void addName() {
        while (true) {
            try {
                System.out.println("请输入你的姓名:");
                String name = sc.next();
                employee.setName(name);
                break;
            } catch (NameOutOfBoundsException e) {
                System.out.println("输入的名字必须是2到6位");
                e.printStackTrace();
            }
        }
    }

    //添加年龄
    public static void addAge() {
        while (true) {
            try {
                System.out.println("请输入年龄:");
                String age1 = sc.next();
                int i = Integer.parseInt(age1);
                employee.setAge(i);
                break;

            } catch (NumberFormatException e) {
                System.out.println("请输入数字");
                e.printStackTrace();
            } catch (AgeOutOfBoundsException e) {
                System.out.println("年龄的范围是16到35之间");
                e.printStackTrace();

            }
        }

    }

    //删除
    public static void remove() {
        //1.先展示已有的员工信息
        System.out.println("现有员工为" + al);
        while (true) {
            try {
                //2.提示要删除的工号
                System.out.println("请输入你要删除的员工的工号:");
                String delNumber = sc.next();
                //3.输入的工号如果不是 七位或者不是数字则会提示用户让用户重新输入,
                // 如果工号不存在则提示用户没有要删除的员工信息, 请选择其他操作,如果工号存在则删除掉此用户
                if (delNumber.length() == 7) {
                    //转为int类型
                    int number = Integer.parseInt(delNumber);
                    //从集合中遍历要删除的内容
                    for (int i = 0; i < al.size(); i++) {
                        if (al.get(i).getNumber() == number) {
                            al.remove(i);
                            break;
                        }
                        //没有找到对应长度的学生信息
                        if (i == al.size() - 1) {
                            System.out.println("没有这个员工的信息");
                        }
                    }
                } else {
                    System.out.println("输入的工号必须是七位,请重新输入");
                    remove();
                }
                break;
            } catch (NumberFormatException e) {
                System.out.println("要查询的员工编号必须为数字");
            }
        }
    }

    //修改
    public static void update() {
        //1.先展示已有的员工信息
        System.out.println("现有员工为" + al);
        while (true) {
            try {
                System.out.println("请输入要修改的员工工号:");
                String updateNumber = sc.next();
                if (updateNumber.length() == 7) {
                    int number = Integer.parseInt(updateNumber);
                    for (int i = 0; i < al.size(); i++) {
                        if (al.get(i).getNumber() == number) {
                            employee = new Employee();
                            employee.setNumber(number);
                            System.out.println("请输入你的姓名:");
                            String name = sc.next();
                            employee.setName(name);
                            System.out.println("请输入你的年龄:");
                            int age = sc.nextInt();
                            employee.setAge(age);
                            System.out.println("请输入你的地址:");
                            String address = sc.next();
                            employee.setAddress(address);
                            al.set(i, employee);
                            System.out.println("修改成功!");
                            break;
                        } else {
                            System.out.println("没有这个员工信息,请选择其他操作");
                            break;
                        }
                    }
                } else {
                    System.out.println("输入的员工编号必须是7位");
                    update();
                }
                break;
            } catch (NumberFormatException e) {
                e.printStackTrace();
                System.out.println("要查询的员工编号必须位数字");
            }
        }

    }

    //查询所有
    public static void select() {
        for (int i = 0; i < al.size(); i++) {
            System.out.println(al.get(i));
        }
    }
}

接下来我们对于集合框架整体架构进行学习

在这里插入图片描述

3.集合的概述和集合类的继承体系

3.1集合类体系结构

在这里插入图片描述

在这里插入图片描述

Collection单列集合,每个元素(数据)只包含一个值。
Map双列集合,每个元素包含两个值(键值对)。

注意:前期先掌握Collection集合体系的使用。

3.2 Collection集合体系

在这里插入图片描述

Collection集合特点

List系列集合:添加的元素是有序、可重复、有索引。

ArrayList、LinekdList :有序、可重复、有索引。

Set系列集合:添加的元素是无序、不重复、无索引。

HashSet: 无序、不重复、无索引;

LinkedHashSet: 有序、不重复、无索引。

TreeSet:按照大小默认升序排序、不重复、无索引。

3.3 总结

1、集合的代表是?
Collection接口。
2、Collection集合分了哪2大常用的集合体系?
List系列集合:添加的元素是有序、可重复、有索引。
Set系列集合:添加的元素是无序、不重复、无索引。
3、如何约定集合存储数据的类型,需要注意什么?
集合支持泛型。
集合和泛型不支持基本类型,只支持引用数据类型。

4.Collection集合

4.1 Collection 集合概述和使用

Collection集合概述
是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现

创建Collection集合的对象
多态的方式
具体的实现类ArrayList

4.2 Collection 集合常用方法

方法名说明
boolean add(E e)添加元素
boolean remove(Object o)从集合中移除指定的元素
boolean removeAll(Object o)根据条件进行删除
void clear()清空集合
boolean contains(Object o)判断集合中是否存在指定的元素
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中元素的个数

4.3.迭代器遍历概述

遍历就是一个一个的把容器中的元素访问一遍。
迭代器在Java中的代表是Iterator,迭代器是集合的专用的遍历方式。

4.3.1 Collection集合获取迭代器

方法名称说明
Iterator iterator()返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引

4.3.2 Iterator中的常用方法

方法名称说明
boolean hasNext()询问当前位置是否有元素存在,存在返回rue ,不存在返回false
E next()获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界。

4.3.3 迭代器执行流程

4.3.4 迭代器使用过程中的注意事项:

1.如果当前位置没有元素,还要强行获取,会报NoSuchElementException
2.迭代器遍历完毕,指针不会复位
3.循环中只能用一次next方法
4.迭代器遍历时,不能用集合的方法进行增删改查【但是可以用迭代器的方法进行删除】

4.3.5 总结

1、迭代器的默认位置在哪里。
Iterator iterator():得到迭代器对象,默认指向当前集合的索引0
2、迭代器如果取元素越界会出现什么问题。
会出现NoSuchElementException异常。

4.4 增强for循环

4.4.1 增强for循环使用

格式:

for(元素数据类型 变量名 : 数组或者Collection集合) {
         //在此处使用变量即可,该变量就是元素
}

增强for循环:既可以遍历集合也可以遍历数组。

举例:

Collection<String> list = new ArrayList<>();
...
for(String ele : list) {
System.out.println(ele);
}

4.4.2 增强for修改变量

修改第三方变量的值不会影响到集合中的元素

4.4.3 总结

1.增强for循环:既可以遍历集合也可以遍历数组。

2.增强for循环格式:

for(元素数据类型 变量名 : 数组或者Collection集合) {
         //在此处使用变量即可,该变量就是元素
}

4.5 Lambda表达式遍历集合

得益于JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。

方法名称说明
default void forEach(Consumer<? super T> action):结合lambda遍历集合

在这里插入图片描述

4.6 案例:Collection集合存储学生对象并遍历

**需求:**创建一个Collection集合存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合

思路:
定义学生类
创建Collection集合对象
创建学生对象
把学生添加到集合
遍历集合(迭代器方式)

4.7 总结

集合中存储的是元素的什么信息?

集合中存储的是元素对象的地址。

  1. Collection是单列集合的顶层接口,所有方法被List和set系列集合共享

  2. 常见成员方法:

add、 clear、 remove、 contains、 isEmpty、 size

  1. 三种通用的遍历方式:
    • 迭代器:在遍历的过程中需要删除元素,请使用迭代器。
    • 增强for、Lambda:
    仅仅想遍历,那么使用增强for或Lambda表达式

5.List集合

5.1 集合类体系结构

在这里插入图片描述

5.2 List集合概述和特点

List集合概述

有序集合,这里的有序指的是存取顺序

用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素

与Set集合不同,列表通常允许重复的元素

List集合特点

有序:存储和取出的元素顺序一致

有索引:可以通过索引操作元素

可重复:存储的元素可以重复

5.3 List集合特有方法

方法名说明
void add(ntindex,Eelement)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(intindex)返回指定索引处的元素方法名

5.4 五种遍历方式对比

在这里插入图片描述

6. 常见的数据结构

6.1 数据结构

数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率


队列
数组
链表

7.ArrayList集合

7.1 List集合常用实现类ArrayList

ArrayList特点:底层数据结构是数组,查询快,增删慢

8.LinkedList集合

8.1 List集合常用实现类

List集合常用子类:ArrayList,LinkedList

ArrayList:底层数据结构是数组,查询快,增删慢

LinkedList:底层数据结构是链表,查询慢,增删快

练习:
      使用LinkedList完成存储字符串并遍历

8.2 LinkedList集合的特有功能

方法名说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

8.3 LinkedList的底层源码

在这里插入图片描述

9.泛型

9.1 泛型概述

泛型:

泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。

泛型的格式:<数据类型>; 注意:泛型只能支持引用数据类型。

集合体系的全部接口和实现类都是支持泛型的使用的。

泛型的好处:

统一数据类型。

把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。

9.2 泛型的定义位置

泛型可以在很多地方进行定义:
类后面———— 泛型类
方法申明上——泛型方法
接口后面 ———泛型接口

9.3 泛型的细节

泛型中不能写基本数据类型

指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型

如果不写泛型,类型默认是Object

9.4 泛型类的概述

定义类时同时定义了泛型的类就是泛型类。

泛型类的格式

修饰符 class 类名<泛型变量>{  }

范例:

public class MyArrayList<T> {  }

此处泛型变量T可以随便写为任意标识,常见的如E、T、K、V等。

作用:

编译阶段可以指定数据类型,类似于集合的作用。

课程案例导学

模拟ArrayList集合自定义一个集合MyArrayList集合,完成添加和查找功能的泛型设计即可。

泛型类的原理:

 把出现泛型变量的地方全部替换成传输的真实数据类型。

9.5 泛型类的总结

1、泛型类的核心思想:把出现泛型变量的地方全部替换成传输的真实数据类型

2、泛型类的作用:编译阶段约定操作的数据的类型,类似于集合的作用。

9.6 泛型方法的概述

定义方法时同时定义了泛型的方法就是泛型方法。
泛型方法的格式

修饰符 <泛型变量> 方法返回值 方法名称(形参列表){}

范例:

 public <T> void show(T t) {  }

作用

方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。

课程案例导学

模拟ArrayList集合自定义一个集合MyArrayList集合,完成添加全部的功能泛型设计即可!

泛型方法的原理:

 把出现泛型变量的地方全部替换成传输的真实数据类型。

9.7 泛型方法的总结

1、泛型方法的核心思想:把出现泛型变量的地方全部替换成传输的真实数据类型

2、泛型方法的作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性

9.8 泛型接口的概述

使用了泛型定义的接口就是泛型接口。

泛型接口的格式

修饰符 interface 接口名称<泛型变量>{}

范例:

public interface Data<E>{}

作用:

泛型接口可以让实现类选择当前功能需要操作的数据类型

课程案例导学

讲解List<E>带学生深入理解

泛型接口的原理:

实现类可以在实现接口的时候传入自己操作的数据类型,这样重写的方法都将是针对于该类型的操作。

9.9 泛型接口的总结

泛型接口的作用:

泛型接口可以约束实现类,实现类可以在实现接口的时候传入自己操作的数据类型这样重写的方法都将是针对于该类型的操作。

9.10 类型通配符

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1667010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

职称论文的AIGC检测

和高校毕业论文一样&#xff0c;职称论文也是需要通过AIGC检测系统&#xff08;www.checkaigc.com&#xff09;&#xff0c;并且也是有一定的要求的。AIGC检测是因为近年来越来越多人开始使用AI写作工具代写论文&#xff0c;为了防止论文中出现过高的AI论文生成内容&#xff0c…

triton编译学习

一 流程 Triton-MLIR: 从DSL到PTX - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/671434808Superjomns blog | OpenAI/Triton MLIR 迁移工作简介https://superjom

品味Fendi club:精酿啤酒的精致与与众不同

啤酒&#xff0c;作为世界三大饮料之一&#xff0c;其口感和品质的差异能给人们带来截然不同的体验。在众多啤酒中&#xff0c;Fendi club以其与众不同的精酿啤酒风格&#xff0c;吸引了无数热爱啤酒的人。 Fendi club啤酒的精致与与众不同&#xff0c;首先体现在其酿造工艺上。…

pyqt显示指定文件夹的所有文件

pyqt显示指定文件夹的所有文件 目的效果代码 目的 选择文件夹后&#xff0c;显示该文件夹的所有文件。 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QPushButton, QListView, QFileDialog,QWidget from PyQt5.QtCore import…

【目标检测论文解读复现NO.37】基于改进的 YOLOv8 变电设备红外图像检测

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

Vellum for Mac v3.7.2激活版:一键创建,轻松出版

还在为繁琐的电子书制作流程而烦恼吗&#xff1f;Vellum for Mac&#xff0c;让您的电子书创作变得轻松简单&#xff01;支持多种格式导入&#xff0c;自动构建书籍内容&#xff0c;无需担心排版和格式问题。丰富的编辑和排版功能&#xff0c;让您的书籍更加精美。一键导出多种…

element 输入框禁止输入空格以及复制的值进去删除空格(vue自定义指令)开箱即用

实例图&#xff1a; 代码&#xff1a; //输入框禁止输入空格 Vue.directive(noSpace, {bind(el) {//禁止输入空格el.addEventListener("keydown", function (event) {if (event.keyCode 32) {event.preventDefault();}});//复制值时去掉空格el.addEventListener(&q…

MATLAB函数fir1的C语言移值

要移值的matlab函数&#xff1a; h3 fir1(16,[0.25 0.50]); C语言版本 #include <iostream> #include <cmath>#define PI acos(-1)double sincEasy(double *x, int len, int index) {double temp PI * x[index];if (temp 0) {return 1.0; // sinc(0) 1}ret…

十四、Redis Cluster集群

Redis Cluster是Redis提供的一个分布式解决方案&#xff0c;在3.0推出。Redis Cluster可以自动将数据分片分布到不同的master节点上&#xff0c;同时提供了高可用的支持&#xff0c;当某个master节点挂了之后&#xff0c;整个集群还是可以正常工作。1、为什么要用Redis Cluster…

Spring底层入门(十一)

1、条件装配 在上一篇中&#xff0c;我们介绍了Spring&#xff0c;Spring MVC常见类的自动装配&#xff0c;在源码中可见许多以Conditional...开头的注解&#xff1a; Conditional 注解是Spring 框架提供的一种条件化装配的机制&#xff0c;它可以根据特定的条件来控制 Bean 的…

stm32f103c8t6之4x4矩阵按键

基于普中精灵开发板 1、矩阵按键原理 当我们需要使用较多的按键时&#xff0c;单片机的IO口可能不够用,这是就需要使用矩阵按键。 对应IO口如下&#xff1a; 步骤解析&#xff1a; 1、全部按键都没有按下时&#xff0c;全行IO为低电平&#xff08;全列对应的IO设置为下拉低…

1060: 无向图的最大度计算

解法&#xff1a; #include<iostream> #include<vector> using namespace std; int arr[100][100]; int main() {int n, max 0;cin >> n;vector<int> sum(n, 0);for (int i 0; i < n; i) {for (int j 0; j < n; j) {cin >> arr[i][j];…

Nginx(简洁版)

基本配置 worker_processes 1; //默认为1&#xff0c;表示开启一个业务进程 events //事件驱动模块&#xff08;&#xff09;{worker_connections 1024; //单个业务进程可接受连接数 } http{include mime.types; // 引入http mime类型&#xff08;在外部已经定义好&#xff0c…

数据链路层(详细版)【02】

接 数据链路层&#xff08;详细版&#xff09;【01】 文章目录 四、以太网MAC层&#xff08;一&#xff09;MAC地址组成&#xff08;1&#xff09;48位MAC地址格式&#xff08;2&#xff09;单播地址 & 多播地址 & 广播地址&#xff08;3&#xff09;全球管理 & 本…

ctfshow web271--web273

web271 laravel5.7反序列化漏洞 define(LARAVEL_START, microtime(true));/* |-------------------------------------------------------------------------- | Register The Auto Loader |-------------------------------------------------------------------------- | |…

OFDM802.11a的FPGA实现(十三)加窗(含verilog和matlab代码)

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 1.前言 添加循环前缀后,对数据还要进行加窗(Windowing)操作。加窗操作可以使OFDM 符号在带宽之外的功率谱密度下降得更快。 2.加窗 对OFDM符号“加窗”意味着令符号周期边缘的幅度…

WHAT - CSS Animationtion 动画系列(二)

目录 一、循环波浪二、关键帧呼应三、关键帧顺接四、利用 transform-origin 做拉伸五、大元素可拆分多个小元素联动六、预留视觉缓冲七、随机感&#xff1a;动画周期设置八、抛物线&#xff1a;两个内外div实现x和y向量运动 今天我们主要学习动画实现要素。 一、循环波浪 利用…

RAG讲解

现有的LLM已经具备了理解、生成、逻辑和记忆能力&#xff0c;RAG(Retrieval Augmented Generation)则是为其套上外挂&#xff0c;使LLM能够访问训练数据来源之外的权威知识库&#xff0c;并生成领域特定的内容&#xff0c;而无须重新训练模型。 RAG的优势 经济高效&#xff1a…

【简单介绍下Sass】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

HTML标签快速入门

文章目录 一、HTML语法规范1.1 基本语法概述1.2 标签关系 二、HTML基本结构标签2.1 第一个HTML网页2.2 基本结构标签总结 三、网页开发工具3.1 文档类型声明标签3.2 lang 语言种类3.3 字符集3.4 总结 四、HTML常用标签4.1 标签语义4.2 标题标签\<h1> - \<h6>&#…