List、Set、Map,你真的会选用吗?

《Java零基础教学》是一套深入浅出的 Java 编程入门教程。全套教程从Java基础语法开始,适合初学者快速入门,同时也从实例的角度进行了深入浅出的讲解,让初学者能够更好地理解Java编程思想和应用。

本教程内容包括数据类型与运算、流程控制、数组、函数、面向对象基础、字符串、集合、异常处理、IO 流及多线程等 Java 编程基础知识,并提供丰富的实例和练习,帮助读者巩固所学知识。本教程不仅适合初学者学习,也适合已经掌握一定 Java 基础的读者进行查漏补缺。

前言

作为一名拥有多年Java开发经验的种子选手,日常开发时,针对集合框架(Collections Framework)是我们日常开发中不可或缺的一部分。在Java中,集合提供了存储和操作数据的核心功能,尤其是在处理大量数据时,如何选择合适的集合类来提高程序的性能和可维护性是我们必须考虑的重要问题。

今天,我将通过深度解析Java中的三大核心集合:ListSetMap,带大家了解它们的特点、应用场景及如何根据不同需求选择合适的集合类型,提升程序的性能和代码的可维护性。

1. Java集合框架概述

Java集合框架是一个包括接口、类和算法的集合,它为我们提供了一些通用的解决方案来存储和处理数据。Java集合框架主要包括:

  • Collection接口:是所有集合类的根接口,提供了一些常用的方法,如添加、删除、遍历等。
  • List、Set、Map:是常用的集合类型,它们各自有不同的特点和使用场景。

今天我们重点讨论三个最常用的集合接口和它们的实现类:ListSetMap,一定会让大家不虚此读。

2. List:有序的集合,允许重复元素

2.1 List接口概述

首先,介绍的是List,它是有序的集合 ,它不仅允许元素重复,而且保持元素的插入顺序。我们可以通过索引来访问List中的元素,常见的实现类有ArrayListLinkedListVector

特点:

  • 有序性List中的元素有特定的顺序,按照插入的顺序进行存储。
  • 允许重复List允许存储重复的元素。
  • 支持索引 :通过索引可以访问List中的元素。

常见实现类:

  • ArrayList:基于动态数组实现,支持快速的随机访问,适合查询较多的场景。
  • LinkedList:基于双向链表实现,插入和删除操作效率高,适合需要频繁修改的场景。
  • Vector :类似于ArrayList,但它是线程安全的,通常不推荐使用。

2.2 适用场景

  • 需要保持元素的顺序 :例如,我们需要记录学生的成绩并按插入顺序展示,List是理想选择。
  • 允许重复元素 :如果你需要存储多个相同的元素,可以使用List,例如存储学生的名字或重复的标签。
  • 频繁按索引访问元素 :当需要通过索引访问元素时,ArrayList表现较好。

示例:使用ArrayList存储学生成绩

接着,我给大家展示下,结合理论与实战给大家把知识点讲透,案例代码如下:

java 复制代码
/**
 * @Author wf
 * @Date 2025-08-23 10:02
 */
public class Test1 {
    public static void main(String[] args) {
        List<String> studentGrades = new ArrayList<>();

        // 添加成绩
        studentGrades.add("A");
        studentGrades.add("B");
        studentGrades.add("A");

        // 按顺序遍历
        for (String grade : studentGrades) {
            System.out.println("Student grade: " + grade);
        }

        // 使用索引访问
        System.out.println("First grade: " + studentGrades.get(0));  // 输出: A
    }
}

根据如上案例,本地实际结果运行展示如下,仅供参考:

优化建议:

  • ArrayList:适用于查询较多的场景,尤其是对大量数据进行频繁访问时。
  • LinkedList:适用于需要频繁插入和删除元素的场景,如队列或双端队列(Deque)。

3. Set:无序的集合,元素不允许重复

3.1 Set接口概述

Set,它是一个不允许重复元素 的集合,它是无序的 ,意味着元素的顺序是不确定的。常见的实现类有HashSetLinkedHashSetTreeSet

特点:

  • 无重复元素Set不允许存储重复的元素。插入时会自动去重。
  • 无序性:元素的顺序不确定。
  • 不支持索引 :不能通过索引访问Set中的元素,通常需要使用迭代器。

常见实现类:

  • HashSet:基于哈希表实现,插入、删除操作的时间复杂度为O(1),但不保证元素的顺序。
  • LinkedHashSet :继承自HashSet,基于链表实现,保持元素的插入顺序。
  • TreeSet:基于红黑树实现,自动排序元素,支持顺序访问。

3.2 适用场景

  • 去重操作 :如果需要存储不重复的元素,Set是最合适的选择。
  • 无序集合 :当不关心元素的顺序时,使用Set能更高效地处理数据。
  • 排序要求 :如果需要按某种规则(如升序或降序)排序元素,可以使用TreeSet

示例:使用HashSet去重

接着,我给大家展示下,结合理论与实战给大家把知识点讲透,案例代码如下:

java 复制代码
/**
 * @Author wf
 * @Date 2025-08-23 10:02
 */
public class Test2 {
    public static void main(String[] args) {
        Set<String> uniqueGrades = new HashSet<>();

        // 添加成绩(重复元素不会被添加)
        uniqueGrades.add("A");
        uniqueGrades.add("B");
        uniqueGrades.add("A");  // 重复,不会添加

        // 遍历Set
        for (String grade : uniqueGrades) {
            System.out.println("Unique grade: " + grade);
        }
    }
}

根据如上案例,本地实际结果运行展示如下,仅供参考:

优化建议:

  • HashSet:适用于需要快速判断元素是否存在或去重的场景。
  • TreeSet:适用于需要元素有序并且不允许重复的场景。

4. Map:键值对集合,存储唯一的键和对应的值

4.1 Map接口概述

Map是一个键值对集合 ,用于存储唯一的键 和对应的 。它不继承自Collection接口,因此在Map中,键和值是独立的。常见的实现类有HashMapTreeMapLinkedHashMap

特点:

  • 键值对存储 :每个Map对象存储的都是唯一的键对应的值
  • 无序性Map中的元素无序,除非使用LinkedHashMap(保持插入顺序)或TreeMap(根据自然顺序或指定比较器排序)。
  • 不允许重复的键Map中的每个键只能出现一次,但多个键可以有相同的值。

常见实现类:

  • HashMap:基于哈希表实现,提供O(1)的查找时间复杂度,不保证元素顺序。
  • LinkedHashMap :继承自HashMap,保持元素插入的顺序。
  • TreeMap:基于红黑树实现,按键的自然顺序(或自定义顺序)排序元素。

4.2 适用场景

  • 需要通过键快速查找值的场景:例如用户信息管理、配置文件解析等。
  • 键唯一的映射关系 :如果需要存储唯一的键和对应的值,Map是最合适的选择。
  • 排序需求 :如果需要根据键进行排序,可以使用TreeMap

示例:使用HashMap存储用户信息

接着,我给大家展示下,结合理论与实战给大家把知识点讲透,案例代码如下:

java 复制代码
/**
 * @Author wf
 * @Date 2025-08-23 10:02
 */
public class Test3 {
    public static void main(String[] args) {
        Map<String, String> userMap = new HashMap<>();

        // 存储用户名和密码
        userMap.put("Alice", "password123");
        userMap.put("Bob", "qwerty");

        // 查找某个用户的密码
        String password = userMap.get("Alice");
        System.out.println("Password for Alice: " + password);

        // 遍历Map
        for (Map.Entry<String, String> entry : userMap.entrySet()) {
            System.out.println("User: " + entry.getKey() + ", Password: " + entry.getValue());
        }
    }
}

根据如上案例,本地实际结果运行展示如下,仅供参考:

优化建议:

  • HashMap:适用于需要高效查找的场景,如缓存、存储配置信息等。
  • TreeMap:适用于需要按顺序访问键值对的场景,如排行榜、排序等。

5. 总结:如何选择合适的集合类?

5.1 List:有序、允许重复元素

  • 适合场景 :当你需要保留元素的顺序,并允许重复元素时,使用List(如ArrayList)。
  • 常见用途:存储用户输入、保存成绩、处理历史记录等。

5.2 Set:无序、不允许重复元素

  • 适合场景 :当你需要确保集合中的元素不重复,且不关心元素的顺序时,使用Set(如HashSet)。
  • 常见用途:去重操作、存储唯一标签、会员ID集合等。

5.3 Map:键值对存储,快速查找

  • 适合场景 :当你需要通过键快速查找对应的值,且键是唯一时,使用Map(如HashMap)。
  • 常见用途:用户信息存储、配置管理、缓存系统等。

5.4 总结建议:

  • ArrayList:查询多,插入少,适合频繁访问数据。
  • LinkedList:插入删除多,查询少,适合操作大量数据。
  • HashSet:要求元素唯一且不关心顺序。
  • TreeSet:要求元素唯一并按排序顺序排列。
  • HashMap:需要通过键快速查找值。
  • TreeMap:需要有序的键值对。

最后,我通过合理选择和使用这些集合类,可以让我们写的代码更加高效、简洁,避免不必要的性能开销,提升系统的整体性能和可维护性。

最后

大家如果觉得看了本文有帮助的话,麻烦给不熬夜崽崽点个三连(点赞、收藏、关注)支持一下哈,大家的支持就是我写作的无限动力。

相关推荐
苹果醋31 小时前
Java并发编程-Java内存模型(JMM)
java·运维·spring boot·mysql·nginx
你怎么知道我是队长1 小时前
C语言---编译的最小单位---令牌(Token)
java·c语言·前端
Elieal2 小时前
Java 链表完全指南:从基础到力扣简单题实战
java·leetcode·链表
寒士obj2 小时前
SpringBoot中的条件注解
java·spring boot·后端
pengzhuofan2 小时前
Java设计模式-外观模式
java·设计模式·外观模式
Emrys_2 小时前
AQS 深入解析
java
G探险者2 小时前
循环中的阻塞风险与异步线程解法
后端
易元2 小时前
模式组合应用-桥接模式(二)
后端
三婶儿2 小时前
在没有客户端的客户环境下,如何用 Python 一键执行 MySQL 与达梦数据库 SQL
运维·后端·python
超级小忍2 小时前
从零开始:JDK 在 Windows、macOS 和 Linux 上的下载、安装与环境变量配置
java·windows·macos