Java 集合框架初体验:用 1 个简单案例带你上手 ArrayList 与 HashSet

Java 集合框架是 Java 编程的核心组件之一,它提供了一套强大的数据结构和算法,帮助开发者高效管理数据。本文将通过一个简单案例,带你入门 ArrayList 和 HashSet 两个常用集合类。ArrayList 是动态数组,允许重复元素,适合顺序访问;HashSet 基于哈希表,不允许重复元素,适合快速查找和去重。下面,我们将构建一个学生管理系统案例,直观展示两者的用法和区别。

什么是 ArrayList?

ArrayList 实现了 List 接口,本质是一个可动态扩容的数组。它支持随机访问,元素可以重复。主要特点包括:

  • 添加元素时,如果容量不足,会自动扩容,平均时间复杂度为 $O(1)$。
  • 根据索引获取元素的复杂度为 $O(1)$。
  • 删除元素时,需要移动后续元素,最坏时间复杂度为 $O(n)$。

ArrayList 适合存储有序数据,例如日志记录或列表展示。

什么是 HashSet?

HashSet 实现了 Set 接口,基于哈希表实现。它不保证元素顺序,但保证元素唯一性(无重复)。主要特点包括:

  • 添加、删除和查找元素的平均时间复杂度为 $O(1)$。
  • 依赖对象的 hashCode()equals() 方法来判断相等性。
  • 不支持索引访问,适合去重或成员检查。

HashSet 常用于缓存或唯一性约束场景。

简单案例:学生管理系统

我们设计一个学生管理系统,使用 ArrayList 存储学生列表,并用 HashSet 确保学生 ID 唯一。案例分为三步:

  1. 定义学生类(Student),包含 ID 和姓名。
  2. 使用 ArrayList 添加学生,模拟数据录入。
  3. 使用 HashSet 检查 ID 唯一性,并输出结果。
代码实现

下面是完整的 Java 代码示例。我们创建一个 Student 类,然后在主类中演示 ArrayList 和 HashSet 的交互。

import java.util.ArrayList;
import java.util.HashSet;

// 定义学生类
class Student {
    private int id;
    private String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    @Override
    public String toString() {
        return "学生ID: " + id + ", 姓名: " + name;
    }
}

public class StudentManager {
    public static void main(String[] args) {
        // 步骤1: 使用ArrayList存储学生列表
        ArrayList<Student> studentList = new ArrayList<>();
        studentList.add(new Student(101, "张三"));
        studentList.add(new Student(102, "李四"));
        studentList.add(new Student(101, "王五")); // 重复ID,用于测试

        // 步骤2: 使用HashSet检查ID唯一性
        HashSet<Integer> idSet = new HashSet<>();
        ArrayList<Student> uniqueStudents = new ArrayList<>();

        for (Student student : studentList) {
            int id = student.getId();
            if (idSet.add(id)) { // 如果ID添加成功(唯一),则加入新列表
                uniqueStudents.add(student);
            } else {
                System.out.println("发现重复ID: " + id + ", 学生: " + student);
            }
        }

        // 步骤3: 输出结果
        System.out.println("所有学生列表 (ArrayList):");
        for (Student s : studentList) {
            System.out.println(s);
        }

        System.out.println("\n唯一学生列表 (HashSet去重后):");
        for (Student s : uniqueStudents) {
            System.out.println(s);
        }
    }
}

运行结果与解释

运行上述代码,输出如下:

发现重复ID: 101, 学生: 学生ID: 101, 姓名: 王五
所有学生列表 (ArrayList):
学生ID: 101, 姓名: 张三
学生ID: 102, 姓名: 李四
学生ID: 101, 姓名: 王五

唯一学生列表 (HashSet去重后):
学生ID: 101, 姓名: 张三
学生ID: 102, 姓名: 李四

  • ArrayList 作用:我们用它存储初始学生列表,包括一个重复 ID(101)。ArrayList 允许重复元素,所以所有学生都被添加。
  • HashSet 作用:通过 idSet.add(id) 检查 ID 是否唯一。如果 ID 已存在(如 101),添加失败并提示重复;否则,学生被加入 uniqueStudents 列表。这确保了输出列表无重复 ID。
  • 性能分析:ArrayList 的遍历复杂度为 $O(n)$,HashSet 的添加操作平均为 $O(1)$,因此整体效率较高。
总结

通过这个案例,你已初步掌握 ArrayList 和 HashSet 的核心用法:

  • ArrayList:适合顺序存储和访问,如列表展示。但需注意重复元素问题。
  • HashSet:擅长去重和快速查找,如唯一性校验。结合使用时,能提升数据管理能力。

在实际开发中,你可以根据需求选择:例如,用户购物车用 ArrayList 存储商品,订单系统用 HashSet 确保订单号唯一。多练习类似案例,能加深对 Java 集合框架的理解。如果有疑问,欢迎在评论区交流!

Java 集合框架初体验:用 1 个简单案例带你上手 ArrayList 与 HashSet

Java 集合框架是 Java 编程的核心组件之一,它提供了一套强大的数据结构和算法,帮助开发者高效管理数据。本文将通过一个简单案例,带你入门 ArrayList 和 HashSet 两个常用集合类。ArrayList 是动态数组,允许重复元素,适合顺序访问;HashSet 基于哈希表,不允许重复元素,适合快速查找和去重。下面,我们将构建一个学生管理系统案例,直观展示两者的用法和区别。

什么是 ArrayList?

ArrayList 实现了 List 接口,本质是一个可动态扩容的数组。它支持随机访问,元素可以重复。主要特点包括:

  • 添加元素时,如果容量不足,会自动扩容,平均时间复杂度为 $O(1)$。
  • 根据索引获取元素的复杂度为 $O(1)$。
  • 删除元素时,需要移动后续元素,最坏时间复杂度为 $O(n)$。

ArrayList 适合存储有序数据,例如日志记录或列表展示。

什么是 HashSet?

HashSet 实现了 Set 接口,基于哈希表实现。它不保证元素顺序,但保证元素唯一性(无重复)。主要特点包括:

  • 添加、删除和查找元素的平均时间复杂度为 $O(1)$。
  • 依赖对象的 hashCode()equals() 方法来判断相等性。
  • 不支持索引访问,适合去重或成员检查。

HashSet 常用于缓存或唯一性约束场景。

简单案例:学生管理系统

我们设计一个学生管理系统,使用 ArrayList 存储学生列表,并用 HashSet 确保学生 ID 唯一。案例分为三步:

  1. 定义学生类(Student),包含 ID 和姓名。
  2. 使用 ArrayList 添加学生,模拟数据录入。
  3. 使用 HashSet 检查 ID 唯一性,并输出结果。
代码实现

下面是完整的 Java 代码示例。我们创建一个 Student 类,然后在主类中演示 ArrayList 和 HashSet 的交互。

import java.util.ArrayList;
import java.util.HashSet;

// 定义学生类
class Student {
    private int id;
    private String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    @Override
    public String toString() {
        return "学生ID: " + id + ", 姓名: " + name;
    }
}

public class StudentManager {
    public static void main(String[] args) {
        // 步骤1: 使用ArrayList存储学生列表
        ArrayList<Student> studentList = new ArrayList<>();
        studentList.add(new Student(101, "张三"));
        studentList.add(new Student(102, "李四"));
        studentList.add(new Student(101, "王五")); // 重复ID,用于测试

        // 步骤2: 使用HashSet检查ID唯一性
        HashSet<Integer> idSet = new HashSet<>();
        ArrayList<Student> uniqueStudents = new ArrayList<>();

        for (Student student : studentList) {
            int id = student.getId();
            if (idSet.add(id)) { // 如果ID添加成功(唯一),则加入新列表
                uniqueStudents.add(student);
            } else {
                System.out.println("发现重复ID: " + id + ", 学生: " + student);
            }
        }

        // 步骤3: 输出结果
        System.out.println("所有学生列表 (ArrayList):");
        for (Student s : studentList) {
            System.out.println(s);
        }

        System.out.println("\n唯一学生列表 (HashSet去重后):");
        for (Student s : uniqueStudents) {
            System.out.println(s);
        }
    }
}

运行结果与解释

运行上述代码,输出如下:

发现重复ID: 101, 学生: 学生ID: 101, 姓名: 王五
所有学生列表 (ArrayList):
学生ID: 101, 姓名: 张三
学生ID: 102, 姓名: 李四
学生ID: 101, 姓名: 王五

唯一学生列表 (HashSet去重后):
学生ID: 101, 姓名: 张三
学生ID: 102, 姓名: 李四

  • ArrayList 作用:我们用它存储初始学生列表,包括一个重复 ID(101)。ArrayList 允许重复元素,所以所有学生都被添加。
  • HashSet 作用:通过 idSet.add(id) 检查 ID 是否唯一。如果 ID 已存在(如 101),添加失败并提示重复;否则,学生被加入 uniqueStudents 列表。这确保了输出列表无重复 ID。
  • 性能分析:ArrayList 的遍历复杂度为 $O(n)$,HashSet 的添加操作平均为 $O(1)$,因此整体效率较高。
总结

通过这个案例,你已初步掌握 ArrayList 和 HashSet 的核心用法:

  • ArrayList:适合顺序存储和访问,如列表展示。但需注意重复元素问题。
  • HashSet:擅长去重和快速查找,如唯一性校验。结合使用时,能提升数据管理能力。

在实际开发中,你可以根据需求选择:例如,用户购物车用 ArrayList 存储商品,订单系统用 HashSet 确保订单号唯一。多练习类似案例,能加深对 Java 集合框架的理解。如果有疑问,欢迎在评论区交流!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐