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

Java集合框架深度剖析:从数据结构到实战应用

引言

Java集合框架是Java开发中的核心组件之一,其设计目标是提供高性能、高复用性的数据容器。无论是数据处理、缓存设计还是高并发场景,集合框架都扮演着关键角色。本文将从List、Map、Set三大核心接口出发,深入剖析其主流实现类(如ArrayListConcurrentHashMapTreeSet等)的底层原理、应用场景及优化策略,并通过代码示例与实战案例,帮助读者全面掌握集合框架的设计哲学与使用技巧。


一、List接口:有序可重复的线性结构

List接口以线性存储为特点,允许元素重复且按插入顺序访问。其核心实现类包括ArrayListLinkedList

1. ArrayList:动态数组的极致优化
  • 底层实现:基于动态数组,初始容量为10,扩容时容量增长为原1.5倍(如从10到15)。

  • 性能特点

    • 查询快:通过索引直接访问元素,时间复杂度为O(1)。

    • 增删慢:中间插入或删除元素需移动后续元素,时间复杂度为O(n)。

  • 适用场景:频繁查询、尾部增删(如日志记录)。

// 示例:ArrayList初始化与扩容机制
ArrayList<String> list = new ArrayList<>(5); // 初始容量5
list.add("A"); // 添加元素,容量不足时自动扩容
list.remove(0); // 删除元素需移动后续元素
2. LinkedList:链表的灵活性与代价
  • 底层实现:基于双向链表,每个节点包含前驱和后继指针1。

  • 性能特点

    • 增删快:在链表中间插入或删除元素只需修改指针,时间复杂度O(1)。

    • 查询慢:需从头节点遍历,时间复杂度O(n)。

  • 适用场景:频繁在头部或中间增删(如实现队列或栈)9。

// 示例:LinkedList实现队列
LinkedList<String> queue = new LinkedList<>();
queue.addLast("Task1"); // 入队
String task = queue.removeFirst(); // 出队

二、Map接口:键值对的映射容器

Map以**键值对(Key-Value)**形式存储数据,核心实现类包括HashMapLinkedHashMapConcurrentHashMapTreeMap

1. HashMap:哈希表的经典实现
  • 底层结构:JDK8后采用数组+链表+红黑树,链表长度超过8时转为红黑树(查询效率从O(n)提升至O(log n))6。

  • 哈希冲突:通过hashCode()equals()解决,需确保不可变对象作为键10。

  • 线程安全:非线程安全,可通过Collections.synchronizedMap()包装或使用ConcurrentHashMap11。

// 示例:HashMap的基本操作
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 10); // 计算键的哈希值定位桶位置
int count = map.get("apple"); // 通过哈希快速查找
2. LinkedHashMap:保留插入顺序的哈希表
  • 扩展特性:在HashMap基础上维护双向链表,支持按插入顺序或访问顺序(LRU)排序2。

  • 应用场景:缓存淘汰策略(如最近最少使用算法)。

// 示例:实现LRU缓存
LinkedHashMap<String, String> lruCache = new LinkedHashMap<>(16, 0.75f, true) {@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return size() > 100; // 容量超限时删除最旧条目}
};
3. ConcurrentHashMap:高并发的分段锁设计
  • 线程安全:JDK7采用Segment分段锁,每个段独立加锁;JDK8优化为CAS+synchronized,粒度更细411。

  • 性能优势:读操作无锁,写操作仅锁住单个桶,适合高并发场景(如计数器、缓存)11。

// 示例:ConcurrentHashMap的线程安全操作
ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("count", 1);
concurrentMap.computeIfPresent("count", (k, v) -> v + 1); // 原子更新
4. TreeMap:基于红黑树的有序映射
  • 排序特性:键按自然顺序或自定义Comparator排序,底层为红黑树(平衡二叉查找树)9。

  • 时间复杂度:插入、删除、查询均为O(log n)。

  • 限制:键不可为null,需实现Comparable接口或提供比较器10。

// 示例:自定义排序规则
TreeMap<Integer, String> treeMap = new TreeMap<>((a, b) -> b - a); // 降序
treeMap.put(3, "C");
treeMap.put(1, "A"); // 内部按键排序存储

三、Set接口:唯一性保证的集合

Set的核心任务是去重,其实现类基于对应的Map(如HashSet基于HashMap)。

1. HashSet:哈希表的快速去重
  • 底层实现:基于HashMap,仅使用键存储元素,值为固定Object对象9。

  • 去重机制:依赖hashCode()equals(),需重写这两个方法10。

2. LinkedHashSet:保留插入顺序的哈希集
  • 扩展特性:继承HashSet,通过LinkedHashMap维护插入顺序,适用于需要顺序遍历的场景2。

3. TreeSet:红黑树排序的唯一集合
  • 底层实现:基于TreeMap,元素自动排序,支持范围查询(如subSet())9。

// 示例:TreeSet的自然排序
TreeSet<String> treeSet = new TreeSet<>();
treeSet.add("Banana");
treeSet.add("Apple"); // 内部按字母顺序排序

四、实战案例:电商平台的购物车设计
需求分析
  • 功能要求:支持商品添加、删除、数量修改,按价格排序显示。

  • 技术选型

    • 购物车存储:使用ConcurrentHashMap保证线程安全,键为商品ID,值为数量11。

    • 排序展示:通过TreeMap按价格排序生成临时视图。

// 示例代码:购物车核心逻辑
ConcurrentHashMap<Long, Integer> cart = new ConcurrentHashMap<>();
cart.put(1001L, 2); // 添加商品ID为1001,数量2// 按价格排序展示
TreeMap<Double, Long> sortedItems = new TreeMap<>();
productList.forEach(p -> sortedItems.put(p.getPrice(), p.getId()));

五、总结与选型建议
  1. List选型

    • 优先ArrayList:适用于查询多、增删少的场景。

    • 选择LinkedList:需频繁在中间增删或实现队列/栈时。

  2. Map选型

    • 默认HashMap:无需排序或线程安全时。

    • 高并发场景用ConcurrentHashMap

    • 需排序或LRU缓存用TreeMap/LinkedHashMap

  3. Set选型

    • 快速去重用HashSet

    • 需顺序遍历用LinkedHashSet

    • 需排序查询用TreeSet

通过理解底层数据结构与设计哲学,开发者可根据实际需求灵活选择集合类,从而优化程序性能与可维护性。

相关文章:

Java集合框架深度剖析:从数据结构到实战应用

引言 Java集合框架是Java开发中的核心组件之一&#xff0c;其设计目标是提供高性能、高复用性的数据容器。无论是数据处理、缓存设计还是高并发场景&#xff0c;集合框架都扮演着关键角色。本文将从List、Map、Set三大核心接口出发&#xff0c;深入剖析其主流实现类&#xff0…...

【MySQL】监控MySQL

目录 使用状态变量监控MySQL 使用性能模式&#xff08;Performance Schema&#xff09;监控MySQL 1.性能模式 2.性能模式设置表 3.sys模式 使用状态变量监控MySQL 使用 show status 语句评估系统运行状况。 可以添加范围修饰符global或session来显示全局或本地状态信息。…...

涅槃上岸,入陕进军,复试全程流程开启!

复试决胜局&#xff0c;整装待发&#xff0c;上岸西电&#xff01; 线下复试注意事项、全流程、录取后西安旅游提前告知&#xff01; 过两天考研复试笔试、机试&#xff08;如果有&#xff09;、面试就要开始了&#xff0c;我们需要准备很多东西&#xff0c;学长从以下几个方面…...

msyql--基本操作之运维篇

检查 root 用户的权限 查看该用户针对这个数据库的权限 -- 如果在终端连接mysql时需要 mysql -u root -p -- 查看用户权限 SELECT user, host FROM mysql.user WHERE user root;可以看的出来root有他的访问权限&#xff0c;如过没有localhost或者% 说明没有访问权限 添加…...

鸿蒙开发:openCustomDialog关闭指定Dialog

前言 本文基于Api13 openCustomDialog弥补了CustomDialogController在使用上存在的诸多限制&#xff0c;实现了可以在任意位置上弹出&#xff0c;可以说是非常的方便&#xff1b;但是&#xff0c;在使用的时候遇到了一些小阻碍&#xff0c;比如一个页面中可能存在多个弹窗&…...

es6 fetch

对比XHR &#x1f6e0;️ fetch 所有配置项 fetch(url, {// 核心配置 method: GET, // HTTP 方法: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONSheaders: { // 请求头&#xff08;支持 Headers 对象或普通对象&#xff09;Content-Type: applicati…...

Apache Tomcat RCE漏洞(CVE-2025-24813)

一&#xff0c;漏洞描述 该漏洞在于 Tomcat 在处理不完整PUT请求上传时&#xff0c;会使用了一个基于用户提供的文件名和路径生成的临时文件。 二&#xff0c;漏洞条件 1&#xff0c;默认 Servlet 启用了写权限&#xff08;默认禁用&#xff09; 2&#xff0c;启用了部分PUT…...

Apache HttpClient使用

一、Apache HttpClient 基础版 HttpClients 是 Apache HttpClient 库中的一个工具类&#xff0c;用于创建和管理 HTTP 客户端实例。Apache HttpClient 是一个强大的 Java HTTP 客户端库&#xff0c;用于发送 HTTP 请求并处理 HTTP 响应。HttpClients 提供了多种方法来创建和配…...

智能汽车图像及视频处理方案,支持视频星轨拍摄能力

美摄科技作为智能汽车图像及视频处理领域的先行者&#xff0c;正以革新性的技术引领着行业的未来发展。美摄科技智能汽车图像及视频处理方案&#xff0c;一个集高效性、智能化、画质增强于一体的创新解决方案&#xff0c;旨在重塑智能汽车图像画质的新标准&#xff0c;并支持前…...

【微服务架构】本地负载均衡的实现(基于随机算法)

前言 负载均衡 概念&#xff1a;一种将网络流量或业务请求均匀分配到多个服务器或服务实例上的技术&#xff0c;旨在提高系统的可用性、性能和可伸缩性。作用&#xff1a; 提高性能&#xff1a;通过将请求分散到多个实例上&#xff0c;避免单个实例因请求过多而过载&#xff…...

C盘急救实录:从爆红到畅快

极速救援通道&#xff08;懒人专享&#xff09; 老规矩&#xff0c;先上王炸方案&#xff01;”小番茄C盘清理器”直达链接&#xff1a;https://cclean-cdn.xkbrowser.com/cleanmaster/FanQieClean_13046_st.exe 这个神器有三绝&#xff1a; 智能扫描引擎&#xff1a;能识别23…...

从零开始理解基于深度学习的语义分割模型:RCA与RCM模块的实现

从零开始理解基于深度学习的语义分割模型:RCA与RCM模块的实现 随着深度学习技术的发展,图像分割任务取得了长足的进步。本文将从一个具体的PyTorch代码实例出发,带大家了解一种 novel 的语义分割网络架构——RCA(Rectangular Self-Calibration Attention)和 RCM(Rectang…...

openGl片段着色器的含义

片段着色器的含义及代码中的应用说明&#xff1a; 1. 片段着色器的基本概念 片段着色器&#xff08;Fragment Shader&#xff09;是OpenGL着色器管线中的关键组件&#xff0c;主要用于计算屏幕空间中每个片段&#xff08;对应像素&#xff09;的最终颜色。它是图形渲染流程的…...

ROS2 部署大语言模型节点

4GB GPU的DeepSeek-Coder 1.3B模型&#xff0c;并且它已经被量化或优化过。以下是具体的步骤&#xff1a; 安装必要的依赖项&#xff1a; pip install transformers torch grpcio googleapis-common-protos创建一个新的ROS 2包&#xff1a; cd ~/ros2_ws/src ros2 pkg creat…...

UART转APB模块ModelSim仿真

一、简介 之前介绍过一个UART转AHB模块&#xff0c;这个代码的框架有个好处&#xff0c;就是FPGA内总线接口比较容易修改成其他总线接口。下图是UART转AHB模块中子模块uart_ahb_mst的框图&#xff0c;主要有三个状态机&#xff1a; &#xff08;1&#xff09; UART_RX_FSM将接收…...

【LeetCode 题解】算法:4.寻找两个正序数组的中位数

1. 引言&#xff1a;挑战 LeetCode 经典算法题 在算法这片广袤无垠的天地里&#xff0c;一道道经典题目宛如夜空中熠熠生辉的星辰&#xff0c;持续吸引着开发者们投身其中&#xff0c;不断探索。今天&#xff0c;我们继续将目光聚焦于 LeetCode 平台上一道极具代表性的题目&am…...

基于 SGLang 部署 Qwen2.5 7B 模型

本文将详细介绍如何使用 SGLang 快速部署 Qwen2.5 7B 模型,并深入探讨 SGLang 的关键性能优化技术,以及预期可以达到的延迟和吞吐量。 1. SGLang 框架介绍 SGLang 旨在解决 LLM 服务中的核心挑战: 高延迟: LLM 推理通常需要较长的计算时间,导致响应延迟高。低吞吐量: 由…...

Cesium 自定义路径导航材质

cesium 自定义路径导航纹理图片随便更换&#xff0c;UI 提供设计图片即可达到效果&#xff1b; 打开小马的weix 关注下 搜索“技术链” 回复关键词《《路径》》获取原始代码&#xff1b; 拿到就能用轻松解决&#xff01;帮忙点个关注吧&#xff01;...

JDBC 连接字连接 KingbaseES支持主从负载均衡参数说明。

JDBC 连接字符串是用于连接 KingbaseES&#xff08;人大金仓数据库&#xff09;的&#xff0c;支持主从负载均衡。让我们逐一解析各个参数的作用&#xff0c;并探讨如何调整到最优。 参数解析 jdbc:kingbase8://10.10.14.19:54321/xxx_onlinejdbc:kingbase8://&#xff1a;指定…...

Java运行时的堆、栈和方法区

目录 1. 堆&#xff08;Heap&#xff09;存储内容与线程关系 2. 栈&#xff08;Stack&#xff09;存储内容与线程关系 3. 方法区&#xff08;Method Area&#xff09;存储内容与线程关系变动 1. 堆&#xff08;Heap&#xff09; 存储内容 对象实例&#xff08;对象实例的全部数…...

【江协科技STM32】BKP备寄存器RTC实时时钟(学习笔记)

BKP备寄存器 BKP简介 BKP&#xff08;Backup Registers&#xff09;备份寄存器BKP可用于存储用户应用程序数据。当VDD&#xff08;2.0~3.6V&#xff09;电源被切断&#xff0c;他们仍然由VBAT&#xff08;1.8~3.6V&#xff09;维持供电。当系统在待机模式下被唤醒&#xff0…...

卷积神经网络 - 参数学习

本文我们通过两个简化的例子&#xff0c;展示如何从前向传播、损失计算&#xff0c;到反向传播推导梯度&#xff0c;再到参数更新&#xff0c;完整地描述卷积层的参数学习过程。 一、例子一 我们构造一个非常简单的卷积神经网络&#xff0c;其结构仅包含一个卷积层和一个输出…...

亮数据爬取API爬取亚马逊电商平台实战教程

前言 在当今数据驱动的商业环境中&#xff0c;企业需要快速、精准地获取互联网上的公开数据以支持市场分析、竞品调研和用户行为研究。然而&#xff0c;传统的手动网页爬取方式面临着诸多挑战&#xff1a;IP封锁、验证码干扰、网站结构频繁变更&#xff0c;以及高昂的运维成本…...

[CLS] Token 在 ViT(Vision Transformer)中的作用与实现

[CLS] Token 在 ViT&#xff08;Vision Transformer&#xff09;中的作用与实现 1. 什么是 [CLS] Token&#xff1f; [CLS]&#xff08;classification token&#xff09;是Transformer模型中一个可学习的嵌入向量&#xff0c;最初在 BERT&#xff08;Bidirectional Encoder …...

基于网启PXE服务器的批量定制系统平台

项目概述 1.需求 公司新购了一批服务器和台式机&#xff0c;需要为台式机和服务器安装系统&#xff0c;一部分需要安装国产OpenEuler&#xff0c;一部分要求安装CentOS 7.9&#xff0c;同时也要满足定制化需求&#xff0c;即按要求分区安装相应软件。 2.使用开源软件 &…...

Reactor/Epoll为什么可以高性能?

在 Reactor 模式中使用 epoll_wait 实现低 CPU 占用率的核心原理是 ​事件驱动的阻塞等待机制&#xff0c;而非忙等待。以下通过分步骤解析其工作原理和性能优势&#xff1a; void network_thread() {int epoll_fd epoll_create1(0);epoll_event events[MAX_EVENTS];// 添加U…...

-JavaEE 应用Servlet 路由技术JDBCMybatis 数据库生命周期

#JavaEE-HTTP-Servlet& 路由 & 周期 参考&#xff1a; https://blog.csdn.net/qq_52173163/article/details/121110753 1 、解释 Servlet 是运行在 Web 服务器或应用服务器上的程序 , 它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数…...

在本地Windows机器加载大模型并生成内容

本篇演示在本地机器下载和加载大模型并获取AI产生的内容。简单起见&#xff0c;使用的大模型是Qwen2.5-0.5B-Instruct&#xff0c;整个模型的所有文件不到1G。 Qwen2.5-0.5B-Instruct 是阿里巴巴云 QWen 团队基于 Transformer 架构开发的轻量级指令调优语言模型&#xff0c;专…...

热门面试题第14天|Leetcode 513找树左下角的值 112 113 路径总和 105 106 从中序与后序遍历序列构造二叉树 (及其扩展形式)以一敌二

找树左下角的值 本题递归偏难&#xff0c;反而迭代简单属于模板题&#xff0c; 两种方法掌握一下 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 我们来分析一下题目&#…...

shopify跨境电商行业前景与规模

Shopify跨境电商行业前景与规模分析 一、行业背景 Shopify 是一个全球知名的电子商务平台&#xff0c;它为小型企业到大型企业提供了创建和管理在线商店的工具。近年来&#xff0c;随着全球化进程的加快以及互联网技术的发展&#xff0c;跨境电商已经成为国际贸易的重要组成部…...