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:需要有序的键值对。

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

最后

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

相关推荐
骄马之死4 小时前
SpringMVC + SpringBoot 核心知识点总结
java·spring boot·后端
GoGeekBaird5 小时前
Anthropic技能"(Skills)的经验分享
后端
王码码20355 小时前
多台服务器怎么统一看状态?Beszel 轻量监控,搭起来不费事
运维·服务器·后端·安全·阿里云·接口·web
郑洁文5 小时前
基于Spring Boot的流浪动物救助网站
java·spring boot·后端·毕设·流浪动物救助
螺丝钉code6 小时前
JAVA项目 Claude code CLAUDE.md 到底应该怎么写
java·人工智能·claude code
指令集梦境7 小时前
Cursor + Spring Boot实战:从零写一个RESTful API
spring boot·后端·restful
摇滚侠7 小时前
Maven 入门+高深 单一架构案例 54-59
java·架构·maven·intellij-idea
VidDown7 小时前
Webhook 调试器:让第三方回调“原形毕露”
java·开发语言·javascript·编辑器·postman
码云之上7 小时前
聊聊如何设计一个高效、稳定的 Node.js 接入层
前端·后端·node.js
折哥的程序人生 · 物流技术专研8 小时前
Java 23 种设计模式:从踩坑到精通 | 原型模式 —— 克隆对象,深拷贝与浅拷贝的坑你踩过吗?
java·设计模式·架构·原型模式·单一职责原则