Java中的集合详解

news2025/5/22 21:38:22

下面是文章详细介绍了 Java 集合框架的基本思路、主要接口与实现、各类集合之间的区别与各自的适用场景,以及一些常见的使用技巧和最佳实践,供你参考。


Java中的集合详解

在 Java 开发中,集合(Collection)作为存储和操作数据的核心组件被广泛使用。Java 的集合框架不仅为我们提供了丰富的数据结构,还通过统一的接口设计使得操作不同集合变得更加灵活和高效。本文将从集合框架的整体架构入手,详细介绍 List、Set、Queue 与 Map 等主要接口及其常见实现,帮助你深入理解 Java 集合的原理与应用。


1. Java集合框架概述

Java 集合框架是从 JDK 1.2 开始引入的,其主要目的是统一数据结构的存储和操作方式。主要特点包括:

  • 统一性与多样性
    所有集合都遵循统一的接口(如 Collection、Map 等),同时又提供了多种实现,满足不同场景下的需求,例如顺序存储、去重、排序、并发操作等。

  • 泛型支持
    自 JDK 5 之后,集合类都支持泛型编程,可以在编译期保证类型安全,同时减少了类型转换的工作。

  • 丰富的工具类
    类似于 CollectionsArrays 等工具类提供了一系列常用的算法和辅助方法,提高了集合操作的效率。


2. 集合框架的整体结构

Java 集合框架大致可以分为两大类:

  1. Collection 接口的实现
    包括 List、Set、Queue 等,用于存储单个元素的集合。

  2. Map 接口的实现
    用于存储键值对映射,不属于 Collection 的子接口,但与集合框架紧密相关。

下图是集合框架的基本层次结构(文字描述):

  • Collection 接口
    ├── List(有序、允许重复)
    │  ├── ArrayList
    │  ├── LinkedList
    │  ├── Vector(线程安全,较少使用)
    │  └── Stack(继承自 Vector,后起作用)
    ├── Set(无序/有序、不允许重复)
    │  ├── HashSet
    │  ├── LinkedHashSet
    │  └── TreeSet
    └── Queue(队列、更多通用于排队处理)
        ├── PriorityQueue
        └── ArrayDeque

  • Map 接口
    ├── HashMap
    ├── LinkedHashMap
    ├── Hashtable(线程安全)
    └── TreeMap


3. 主要集合接口详解

3.1 List 接口

特点:

  • 有序性:List 保存元素的插入顺序,允许通过索引访问。
  • 允许重复:同一元素在列表中可以出现多次。

常见实现:

  • ArrayList

    • 底层使用动态数组存储数据,支持快速随机访问(get、set 操作),但在中间插入或删除元素开销较大。
    • 非线程安全,适用于读操作多、写操作较少的场景。
    • 示例代码:
      List<String> arrayList = new ArrayList<>();
      arrayList.add("Java");
      arrayList.add("Python");
      arrayList.add("C++");
      // 遍历
      for(String s : arrayList) {
          System.out.println(s);
      }
      
  • LinkedList

    • 采用双向链表实现,适合频繁在头尾做插入或删除操作,但随机访问性能较差。
    • 除了 List 接口外,还实现了 Queue 接口,支持队列操作。
    • 示例代码:
      List<String> linkedList = new LinkedList<>();
      linkedList.add("Java");
      linkedList.add("Python");
      linkedList.add("C++");
      // 遍历
      for(String s : linkedList) {
          System.out.println(s);
      }
      
  • Vector 与 Stack

    • Vector 是早期实现的动态数组,实现了 List 接口,并通过 synchronized 关键字保证线程安全,但性能较低。
    • Stack 继承自 Vector,用于实现后进先出(LIFO)的数据结构,不过现在更多推荐使用 ArrayDeque 代替 Stack。

3.2 Set 接口

特点:

  • 不允许重复:Set 不允许元素重复,通常在添加元素时会先通过 hashCode/equals 或 Comparator 判断是否已存在。
  • 无序或有序:HashSet 无序;LinkedHashSet 保留插入顺序;TreeSet 按自然排序或自定义排序。

常见实现:

  • HashSet

    • 底层基于 HashMap 实现,不保证顺序,但查找效率高。
    • 适用于去重和快速查找的场景。
    • 示例代码:
      Set<String> hashSet = new HashSet<>();
      hashSet.add("Java");
      hashSet.add("Python");
      hashSet.add("C++");
      // 重复添加无效
      hashSet.add("Java");
      for(String s : hashSet) {
          System.out.println(s);
      }
      
  • LinkedHashSet

    • 在 HashSet 的基础上增加了链表维护插入顺序,因此遍历时顺序与添加时一致。
    • 略微牺牲了性能,但在需要有序去重时非常实用。
  • TreeSet

    • 基于红黑树实现,能按照自然顺序或 Comparator 指定的顺序自动排序。
    • 使用时要求元素必须实现 Comparable 接口,或者在创建时传入 Comparator。
    • 示例代码:
      Set<Integer> treeSet = new TreeSet<>();
      treeSet.add(3);
      treeSet.add(1);
      treeSet.add(2);
      // 输出: 1, 2, 3
      for(Integer num : treeSet) {
          System.out.println(num);
      }
      

3.3 Queue 接口

特点:

  • 主要用于按照一定策略(如先进先出 FIFO)存储等待处理的对象。
  • 支持插入、删除及检索操作。

常见实现:

  • PriorityQueue

    • 元素按自然顺序或指定 Comparator 顺序排列,常用于任务调度或事件排序场景。
  • ArrayDeque

    • 支持双端队列操作,既可以作为栈(后进先出)也可以作为队列(先进先出)使用,一般推荐用 ArrayDeque 替代 Stack 和 LinkedList 来实现队列数据结构。

3.4 Map 接口

特点:

  • 以键值对(Key-Value)的方式存储数据,每个键对应唯一一个值。
  • Map 不继承自 Collection 接口,但同样是集合框架的重要组成部分。

常见实现:

  • HashMap

    • 底层基于哈希表实现,支持快速存取,对于键对象要求实现正确的 hashCode 与 equals 方法。
    • 允许一个 null 键(最多一个)和多个 null 值,非线程安全,适用于单线程或通过外部同步控制的场景。
    • 示例代码:
      Map<String, Integer> hashMap = new HashMap<>();
      hashMap.put("Java", 1);
      hashMap.put("Python", 2);
      hashMap.put("C++", 3);
      System.out.println(hashMap.get("Java"));
      
  • LinkedHashMap

    • 继承自 HashMap,同时维护一个链表以保留插入顺序或访问顺序。在遍历时,顺序与插入顺序一致。
    • 常用于构建具有缓存淘汰策略的场景。
  • TreeMap

    • 基于红黑树实现,按照键的自然顺序或者指定 Comparator 的顺序进行排序。
    • 要求键必须实现 Comparable 接口或者在构造时提供 Comparator。
  • Hashtable

    • 与 HashMap 类似,但 Hashtable 的所有方法都是同步的,因此线程安全,但性能较低。
    • 由于不允许 null 键或 null 值,如今通常使用 ConcurrentHashMap 替代 Hashtable。

4. 选择合适集合的注意事项

  1. 性能差异

    • 如果需要频繁随机访问数据,ArrayList 是首选;如果需要频繁插入和删除,LinkedList 会更高效。
    • 对于集合去重与快速查找,HashSet 优于 TreeSet;而需要排序时,TreeSet 更有优势。
  2. 线程安全

    • 大多数集合类如 ArrayList、HashMap 不是线程安全的。如果在并发环境使用,可以使用线程安全的集合(如 Vector、Hashtable 或者通过 Collections.synchronizedXXX 方法包装)。
  3. 内存与扩容

    • ArrayList 会根据需要扩容,扩容时会涉及数组复制,可能影响性能。
    • LinkedList 则每个节点包含额外的指针,内存开销更大。
  4. 排序与比较

    • 如果需要自定义排序,TreeSet、TreeMap 可传入 Comparator,而 ArrayList 则可调用 Collections.sort() 进行排序。

5. 总结

Java 集合框架提供了一整套丰富且高效的数据结构,使开发人员可以根据需求灵活选择适合的集合类型。通过对 List、Set、Queue 和 Map 等接口及其实现的深入理解,我们不仅可以更好地提高程序性能,还可以写出类型安全、易于维护的代码。

希望本文对你全面了解 Java 中的集合有所帮助。如果你在使用过程中有更多疑问或实践心得,欢迎在评论区交流讨论!


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

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

相关文章

篇章五 项目创建

目录 1.创建一个SpringBoot项目 2.创建核心类 2.1 Exchange类 2.2 MessageQueue类 2.3 Binding类 2.4 Message类 1.Message的组成 2.逻辑删除 3.工厂方法 4.序列化与反序列化 5.offsetBeg和offsetEnd 1.创建一个SpringBoot项目 1.点击 2.填写表单 3.添加依赖 2.创建…

aws平台s3存储桶夸域问题处理

当我们收到开发反馈s3存在跨域问题 解决步骤&#xff1a; 配置 S3 存储桶的 CORS 设置&#xff1a; 登录到 AWS 管理控制台。转到 S3 服务。选择你存储文件的 存储桶。点击 权限 标签页。在 跨域资源共享&#xff08;CORS&#xff09;配置 部分&#xff0c;点击 编辑。 登陆…

【vue-text-highlight】在vue2的使用教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载二、使用步骤1.引入库2.用法 效果速通 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发…

pycharm无法正常调试问题

pycharm无法正常调试问题 1.错误代码 已连接到 pydev 调试器(内部版本号 231.8109.197)Traceback (most recent call last):File "E:\Python\pycharm\PyCharm 2023.1\plugins\python\helpers\pydev\_pydevd_bundle\pydevd_comm.py", line 304, in _on_runr r.deco…

Leetcode百题斩-哈希

看来面试前还是要老老实实刷leetcode为好&#xff0c;今天看到一个题库&#xff0c;leetcode百题斩&#xff0c;刚好最近面试的这两题全在里面。瞄了一眼&#xff0c;也有不少题之前居然也刷过。那么&#xff0c;冲冲冲&#xff0c;看多久能把这百题刷完。 第一天&#xff0c;先…

EXIST与JOIN连表比较

结论 1&#xff1a;EXIST可以用于链表&#xff0c;且可以利用到索引2&#xff1a;当join无法合理利用到索引&#xff0c;可以尝试EXIST链表3&#xff1a;EXIST在某些情况下可以更好地利用到索引4&#xff1a;大数据量时&#xff0c;要考虑EXIST的使用 EXIST SQL: EXPLAN JOIN…

【Linux】利用多路转接epoll机制、ET模式,基于Reactor设计模式实现

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;多路转接epoll&#xff0c;实现echoserver 至此&#xff0c;Linux与…

react中运行 npm run dev 报错,提示vite.config.js出现错误 @esbuild/win32-x64

在React项目中运行npm run dev时&#xff0c;如果遇到vite.config.js报错&#xff0c;提示esbuild/win32-x64在另一个平台中被使用&#xff0c;通常是由于依赖冲突或缓存问题导致的。解决方法是删除node_modules文件夹&#xff0c;并重新安装依赖。 如下图&#xff1a; 解决办…

鸿蒙UI开发——Builder与LocalBuilder对比

1、概 述 在ArkUI中&#xff0c;有的朋友应该接触过Builder和LocalBuilder。其中有了LocalBuilder的存在&#xff0c;是为了解决组件的父子关系和状态管理的父子关系保持一致的问题。 这里面最直观的表现则是this的指向问题与组件刷新问题&#xff0c;本文对Builder与LocalBu…

关于光谱相机的灵敏度

一、‌灵敏度的核心定义‌ ‌光谱灵敏度&#xff08;单色灵敏度&#xff09;‌ 描述光谱相机对单色辐射光的响应能力&#xff0c;即探测器对特定波长入射光的输出信号强度与入射光功率的比值。 例如&#xff0c;若在680nm波长下的光谱灵敏度较高&#xff0c;则表示该相机对此…

Model 速通系列(一)nanoGPT

这个是新开的一个系列用来手把手复现一些模型工程&#xff0c;之所以开这个系列是因为有人留言说看到一个工程不知道从哪里读起&#xff0c;出于对自身能力的提升与兴趣&#xff0c;故新开了这个系列。由于主要动机是顺一遍代码并提供注释。 该系列第一篇博客是 nanoGPT &…

MySQL--day4--排序与分页

&#xff08;以下内容全部来自上述课程&#xff09; 1. 排序数据 1.1 排序基本使用 #1.排序 #如果没有使用排序操作&#xff0c;默认情况下查询返回的数据是按照添加数据的顺序显示的 SELECT * FROM employees;# 练习:按照salary从高到低的顺序显示员工信息 # 使用 ORDER …

系分论文《论软件系统安全分析和应用》

系统分析师论文范文系列 【摘要】 2023年3月&#xff0c;我司承接了某知名电商企业“智能化供应链管理系统”的开发任务&#xff0c;我作为系统分析师负责全面的安全分析与设计工作。该系统以提升电商供应链效率为核心&#xff0c;整合仓储、物流、支付等模块&#xff0c;并需应…

Mac安装redis

1、 去往网址 http://​编download.​编redis.io/releases/ 找到任意 结尾为* .tar.gz的文件下载下来 2、使用终端进入下载下来的redis文件 3、直接执行redis-server 如果出现redis标志性的图代表成功 如果显示command not found :redis-server 则在终端再进入src文件夹下&…

srs-7.0 支持obs推webrtc流

demo演示 官方教程: https://ossrs.net/lts/zh-cn/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP 实现原理就是通过WHIP协议来传输 SDP信息 1、运行 ./objs/srs -c conf/rtc.conf 2、obs推流 3、web端播放webrtc流 打开web:ht

Babylon.js学习之路《七、用户交互:鼠标点击、拖拽与射线检测》

文章目录 1. 引言&#xff1a;用户交互的核心作用1.1 材质与纹理的核心作用 2. 基础交互&#xff1a;鼠标与触摸事件2.1 绑定鼠标点击事件2.2 触摸事件适配 3. 射线检测&#xff08;Ray Casting&#xff09;3.1 射线检测的原理3.2 高级射线检测技巧 4. 拖拽物体的实现4.1 拖拽基…

星际争霸小程序:用Java实现策略模式的星际大战

在游戏开发的世界里&#xff0c;策略模式是一种非常实用的设计模式&#xff0c;它允许我们在运行时动态地选择算法或行为。今天&#xff0c;我将带你走进一场星际争霸的奇幻之旅&#xff0c;用Java实现一个简单的星际争霸小程序&#xff0c;通过策略模式来模拟不同种族单位的战…

Python数据可视化高级实战之一——绘制GE矩阵图

目录 一、课程概述 二、GE矩阵? 三、GE 矩阵图的适用范围 五、GE 矩阵的评估方法 (一)市场吸引力的评估要素 二、企业竞争实力的评估要素 三、评估方法与实践应用 1. 定量与定性结合法 2. 数据来源 六、GE矩阵的图形化实现 七、总结:GE 矩阵与 BCG 矩阵的对比分析 (一)GE…

StreamSaver实现大文件下载解决方案

StreamSaver实现大文件下载解决方案 web端 安装 StreamSaver.js npm install streamsaver # 或 yarn add streamsaver在 Vue 组件中导入 import streamSaver from "streamsaver"; // 确保导入名称正确完整代码修正 <!--* projectName: * desc: * author: dua…

CSS【详解】弹性布局 flex

适用场景 一维&#xff08;行或列&#xff09;布局 基本概念 包裹所有被布局元素的父元素为容器 所有被布局的元素为项目 项目的排列方向&#xff08;垂直/水平&#xff09;为主轴 与主轴垂直的方向交交叉轴 容器上启用 flex 布局 将容器的 display 样式设置为 flex 或 i…