当前位置: 首页 > article >正文

Java 集合框架中的 List、ArrayList 和 泛型 实例

在这里插入图片描述

Java 集合框架中的 ListArrayList 和 泛型

在 Java 中,集合框架提供了许多不同类型的集合类,用于存储和操作对象。ListArrayList 是最常用的两种集合类型,而泛型(Generics)则是 Java 中的一项重要特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现类型安全和代码复用。本文将通过案例展示如何综合使用 ListArrayList 和泛型来管理学生数据。

1. ListArrayList

List

List 是 Java 集合框架中的一个接口,它表示一个有序的元素集合,允许元素重复。List 接口继承自 Collection 接口,并定义了一些基本的方法,如 add()remove()get()size()

public interface List<E> extends Collection<E> {
    // List 接口中的方法    
}

其中,E 是泛型参数,表示 List 中存储的元素类型。你可以在创建 List 时指定元素类型,例如 List<String> 表示一个包含 String 元素的列表,List<Student> 表示一个包含 Student 对象的列表。

ArrayList

ArrayListList 接口的一个实现,它基于动态数组实现,能够根据需要自动扩展容量。ArrayList 是一个常用的实现,因为它提供了常数时间的随机访问和高效的插入操作。

List<Student> students = new ArrayList<>();

2. 泛型(Generics)

泛型是 Java 中的一项强大特性,允许我们在编写类、接口或方法时使用类型参数,以便支持不同类型的数据。泛型可以提高代码的类型安全性,避免了强制类型转换的麻烦,并使得代码更易于复用。

// 创建一个 String 类型的 List
List<String> stringList = new ArrayList<>();

// 创建一个 Student 类型的 List
List<Student> studentList = new ArrayList<>();

通过泛型,编译器会在编译时检查类型,确保在集合中只存储指定类型的元素,从而避免了运行时的 ClassCastException 异常。

3. 动态数组与泛型的关系

动态数组和泛型虽然是两个不同的概念,但它们在 Java 集合框架中经常一起使用。例如,ArrayList 是基于动态数组实现的,同时支持泛型,使得我们能够存储不同类型的数据,并提供类型安全。

动态数组(Dynamic Array)

动态数组是一种可以根据需求动态扩展或收缩的数组。它通常会在数组满时进行扩展,扩展的容量一般是当前数组的两倍。ArrayList 就是一个典型的动态数组实现。

泛型(Generics)

泛型允许我们在定义类或方法时使用类型参数,支持不同数据类型的复用。通过泛型,ArrayList 可以存储任何类型的数据,同时提供类型安全。

4. 综合使用案例:学生管理系统

以下是一个综合使用 ListArrayList 和泛型的案例,展示了如何使用 List<Student> 来管理学生信息,并进行增、删、查、改等操作。

步骤 1:创建 Student

首先,我们创建一个简单的 Student 类,包含学生的基本信息。

public class Student {
    private String id;
    private String name;
    private String major;
    private int age;

    // 构造函数
    public Student(String id, String name, String major, int age) {
        this.id = id;
        this.name = name;
        this.major = major;
        this.age = age;
    }

    // Getter 和 Setter 方法
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public int getAge() {
        return age;
    }

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

    // 打印学生信息
    @Override
    public String toString() {
        return "Student{id='" + id + "', name='" + name + "', major='" + major + "', age=" + age + "}";
    }
}
步骤 2:创建 StudentManager

接下来,我们定义一个 StudentManager 类来管理学生信息。我们将使用 List<Student> 来存储学生对象,并提供增、删、查、改操作。

import java.util.ArrayList;
import java.util.List;

public class StudentManager {
    private List<Student> students;

    // 构造方法,初始化学生列表
    public StudentManager() {
        students = new ArrayList<>();
    }

    // 添加学生
    public void addStudent(Student student) {
        students.add(student);
        System.out.println("Student added: " + student);
    }

    // 删除学生
    public void removeStudentById(String id) {
        students.removeIf(student -> student.getId().equals(id));
        System.out.println("Student with ID " + id + " removed.");
    }

    // 查找学生
    public Student findStudentById(String id) {
        for (Student student : students) {
            if (student.getId().equals(id)) {
                return student;
            }
        }
        return null; // 如果未找到,返回 null
    }

    // 更新学生信息
    public void updateStudent(String id, String name, String major, int age) {
        Student student = findStudentById(id);
        if (student != null) {
            student.setName(name);
            student.setMajor(major);
            student.setAge(age);
            System.out.println("Student updated: " + student);
        } else {
            System.out.println("Student with ID " + id + " not found.");
        }
    }

    // 打印所有学生
    public void printAllStudents() {
        System.out.println("All students:");
        for (Student student : students) {
            System.out.println(student);
        }
    }
}
步骤 3:使用学生管理系统

我们可以通过 StudentManager 类来管理学生信息。以下是操作示例:

public class Main {
    public static void main(String[] args) {
        // 创建学生管理器对象
        StudentManager manager = new StudentManager();

        // 创建学生对象
        Student student1 = new Student("S001", "Alice", "Computer Science", 20);
        Student student2 = new Student("S002", "Bob", "Mathematics", 21);
        Student student3 = new Student("S003", "Charlie", "Physics", 22);

        // 添加学生到管理器
        manager.addStudent(student1);
        manager.addStudent(student2);
        manager.addStudent(student3);

        // 打印所有学生
        manager.printAllStudents();

        // 查找学生
        System.out.println("Finding student with ID S002: " + manager.findStudentById("S002"));

        // 更新学生信息
        manager.updateStudent("S002", "Bobby", "Statistics", 22);

        // 删除学生
        manager.removeStudentById("S003");

        // 打印所有学生
        manager.printAllStudents();
    }
}
运行结果
Student added: Student{id='S001', name='Alice', major='Computer Science', age=20}
Student added: Student{id='S002', name='Bob', major='Mathematics', age=21}
Student added: Student{id='S003', name='Charlie', major='Physics', age=22}
All students:
Student{id='S001', name='Alice', major='Computer Science', age=20}
Student{id='S002', name='Bob', major='Mathematics', age=21}
Student{id='S003', name='Charlie', major='Physics', age=22}
Finding student with ID S002: Student{id='S002', name='Bob', major='Mathematics', age=21}
Student updated: Student{id='S002', name='Bobby', major='Statistics', age=22}
Student with ID S003 removed.
All students:
Student{id='S001', name='Alice', major='Computer Science', age=20}
Student{id='S002', name='Bobby', major='Statistics', age=22}

总结

在这个综合案例中,我们展示了如何使用 ListArrayList 和泛型来管理学生数据。通过泛型的引入,我们确保了集合中只能存储指定类型的元素,从而提高了类型安全性。ArrayList 提供了动态数组的功能,能够灵活管理学生数据的存储,同时通过 StudentManager 类,提供了增、删、查、改等基本的操作。


这个案例通过简洁的代码示范了如何在 Java 中综合使用 ListArrayList 和泛型,并结合实际的管理系统需求,帮助开发者更好地理解 Java 集合的基本使用。


http://www.kler.cn/a/448327.html

相关文章:

  • 36. Three.js案例-创建带光照和阴影的球体与平面
  • 智能座舱进阶-应用框架层-Handler分析
  • electron打包linux环境
  • 常用的缓存技术都有哪些
  • Linux系统的阻塞方式和非阻塞方式是什么意思?
  • VSCode:Markdown插件安装使用 -- 最简洁的VSCode中Markdown插件安装使用
  • 数据库的范式
  • 学技术学英文:java CyclicBarrier 和 CountDownLatch用法区别,举例生动看完不会忘
  • Unity中通过代码设置材质HDR颜色的方法参考
  • opencv 项目--图像匹配
  • (13)CT137A- 简易音乐盒设计
  • sentinel学习笔记4-SPI 在 Sentinel 中的应用
  • 本地电脑生成SSH公钥私钥对,用于SSH远程连接服务器
  • 【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
  • 泛型(2)
  • 开源!自制一个桌面宠物(STM32CUBEMX HAL库 PWM波 小项目)
  • 在 CUDA C/C++ 中使用共享內存
  • 路径规划之启发式算法之二十一:禁忌搜索算法(Tabu Search,TS)
  • Linux 端口操作
  • 【游戏设计原理】21 - 解谜游戏的设计
  • 【Mac】安装 PaddleOCR
  • springboot java ffmpeg 视频压缩、提取视频帧图片、获取视频分辨率
  • IntelliJ IDEA Docker集成
  • 适用于.net的操作excel的库
  • vsCode怎么使用vue指令快捷生成代码
  • stm32实现出厂设置和恢复出厂设置