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

Java常用数据结构底层实现原理及应用场景

一、线性结构

1. ArrayList
  • 底层实现:动态数组(Object[] elementData)。

  • 核心特性

    • 默认初始容量为 10,扩容时容量增长为原来的 1.5 倍(int newCapacity = oldCapacity + (oldCapacity >> 1))。

    • 随机访问快(O(1)),插入/删除慢(需移动元素,O(n))。

    • 非线程安全,可用 Collections.synchronizedList 包装。

2. LinkedList
  • 底层实现:双向链表(Node<E> 节点,包含前驱、后继指针)。

  • 核心特性

    • 插入/删除快(O(1),但需先遍历到位置,实际为 O(n))。

    • 随机访问慢(需从头遍历,O(n))。

    • 实现了 Deque 接口,可作为队列或栈使用。

3. Vector
  • 底层实现:与 ArrayList 类似,但所有方法用 synchronized 修饰。

  • 缺点:性能差(锁粒度大),已被 CopyOnWriteArrayList 或 Collections.synchronizedList 取代。


二、哈希表结构

1. HashMap
  • 底层实现(JDK 8+):

    • 数组 + 链表/红黑树(Node<K,V>[] table)。

    • 链表长度超过 8 且数组长度 ≥ 64 时,链表转为红黑树;树节点数 ≤ 6 时退化为链表。

  • 关键机制

    • 哈希计算(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)(扰动函数减少哈希冲突)。

    • 扩容:默认负载因子 0.75,容量翻倍(newCap = oldCap << 1),重新哈希(JDK 8 优化:元素位置为原位置或原位置+旧容量)。

  • 非线程安全,多线程下可能死循环(JDK 7 链表头插法导致)。

2. LinkedHashMap
  • 底层实现:继承 HashMap,通过双向链表维护插入顺序或访问顺序(LRU 实现基础)。

  • 用途:实现缓存淘汰策略(覆盖 removeEldestEntry 方法)。

3. ConcurrentHashMap
  • 底层实现(JDK 8+):

    • 分段锁 → 改为 Node 数组 + CAS + synchronized(锁单个链表头或树根节点)。

    • 支持高并发,读操作无锁。

  • 关键优化

    • size() 通过 baseCount 和 CounterCell[] 分片统计,避免竞争。


三、树形结构

1. TreeMap
  • 底层实现:红黑树(自平衡二叉搜索树)。

  • 特性

    • 键按自然顺序或 Comparator 排序。

    • 插入/删除/查询时间复杂度 O(log n)

  • 用途:范围查询(ceilingKey()floorKey())。

2. PriorityQueue
  • 底层实现:二叉堆(数组实现,Object[] queue)。

  • 特性

    • 堆顶元素为最小(默认小顶堆)或最大(通过 Comparator 定义)。

    • 插入(siftUp)和删除(siftDown)时间复杂度 O(log n)


四、集合结构

1. HashSet
  • 底层实现:基于 HashMap(所有值映射到同一个 PRESENT 对象)。

  • 特性

    • 元素唯一性(依赖 hashCode() 和 equals())。

    • 无序,允许 null

2. LinkedHashSet
  • 底层实现:继承 HashSet,内部使用 LinkedHashMap 维护插入顺序。

3. TreeSet
  • 底层实现:基于 TreeMap,元素按自然顺序或 Comparator 排序。


五、队列结构

1. ArrayDeque
  • 底层实现:循环数组(Object[] elements)。

  • 特性

    • 双端队列(队头/队尾均可操作)。

    • 比 LinkedList 更高效(内存连续,缓存友好)。

2. BlockingQueue
  • 实现类ArrayBlockingQueue(数组)、LinkedBlockingQueue(链表)、PriorityBlockingQueue(堆)。

  • 特性

    • 线程安全,支持阻塞插入/取出(put()take())。

    • 用于生产者-消费者模型。


六、底层实现原理总结

数据结构底层实现时间复杂度(平均)线程安全
ArrayList动态数组查询 O(1),增删 O(n)
LinkedList双向链表查询 O(n),增删 O(1)
HashMap数组+链表/红黑树增删查 O(1)
ConcurrentHashMap数组+CAS+同步块增删查 O(1)是(分段锁)
TreeMap红黑树增删查 O(log n)
PriorityQueue二叉堆插入/删除 O(log n)

七、关键设计思想

  1. 动态扩容

    • ArrayList/HashMap 通过扩容平衡空间与时间。

    • 扩容需重新分配内存和复制数据,尽量初始化时预估容量(如 new ArrayList<>(100))。

  2. 哈希冲突解决

    • 开放寻址法(如 ThreadLocalMap) vs 链地址法(如 HashMap)。

    • JDK 8 的 HashMap 通过红黑树优化链表过长问题。

  3. 树化与退化

    • 红黑树保证极端情况下(哈希冲突严重)查询效率仍为 O(log n)

    • 树化阈值(8)基于泊松分布统计,冲突概率极低时避免过度优化。

  4. 并发控制

    • ConcurrentHashMap 通过 CAS + synchronized 降低锁粒度。

    • CopyOnWriteArrayList 通过写时复制实现读操作无锁。


八、使用场景建议

  • 随机访问多 → ArrayList

  • 频繁插入/删除 → LinkedList

  • 键值对存储 → HashMap(无需排序)或 TreeMap(需排序)。

  • 高并发场景 → ConcurrentHashMap 或 CopyOnWriteArrayList

  • 任务调度 → PriorityQueue(如定时任务按时间排序)。

理解底层实现能帮助开发者避免性能陷阱(如 HashMap 未设置初始容量导致频繁扩容),并合理选择数据结构。

相关文章:

Java常用数据结构底层实现原理及应用场景

一、线性结构 1. ArrayList 底层实现&#xff1a;动态数组&#xff08;Object[] elementData&#xff09;。 核心特性&#xff1a; 默认初始容量为 10&#xff0c;扩容时容量增长为原来的 1.5 倍&#xff08;int newCapacity oldCapacity (oldCapacity >> 1)&#xf…...

利用朴素贝叶斯对UCI 的 mushroom 数据集进行分类

朴素贝叶斯&#xff08;Naive Bayes&#xff09;是一种基于贝叶斯定理的简单而有效的分类算法&#xff0c;特别适合处理文本分类和多类别分类问题。UCI的Mushroom数据集是一个经典的分类数据集&#xff0c;包含蘑菇的特征和类别&#xff08;可食用或有毒&#xff09;。 1. 数据…...

Linux火墙管理及优化

网络环境配置 使用3个新的虚拟机【配置好软件仓库和网络的】 F1 192.168.150.133 NAT F2 192.168.150.134 192.168.10.20 NAT HOST-ONLY 网络适配仅主机 F3 192.168.10.30 HOST-ONLY 网络适配仅主机 1 ~]# hostnamectl hostname double1.timinglee.org 【更…...

Visual Studio 制作msi文件环境搭建

一、插件安装 a. 插件寻找 在 Visual Studio 2017 中&#xff0c;如果你希望安装用于创建 MSI 安装包的插件&#xff0c;第一步是&#xff1a;打开 Visual Studio 后&#xff0c;点击顶部菜单栏中的 “工具”&#xff08;Tools&#xff09;&#xff0c;然后选择下拉菜单中的 “…...

(Java基础笔记vlog)Java中常见的几种设计模式详解

前言&#xff1a; 在 Java 编程里&#xff0c;设计模式是被反复使用、多数人知晓、经过分类编目的代码设计经验总结。他能帮助开发者更高效地解决常见问题&#xff0c;提升代码的可维护性、可扩展性和复用性。下面介绍Java 中几种常见的设计模式。 单例模式&#xff08;Singlet…...

C++ vector 深度解析:从原理到实战的全方位指南

一、引言 在 C 编程中&#xff0c;我们经常需要处理一组数据。比如&#xff0c;你想存储一个班级所有学生的成绩&#xff0c;或者保存用户输入的一组数字。最容易想到的方法是使用数组&#xff1a; int scores[100]; // 定义一个能存储100个成绩的数组但数组有两个明显的缺点…...

鸿蒙进阶——Framework之Want 隐式匹配机制概述

文章大纲 引言一、Want概述二、Want的类型1、显式Want2、隐式Want3、隐式Want的匹配 三、隐式启动Want 源码概述1、有且仅有一个Ability匹配2、有多个Ability 匹配需要弹出选择对话框3、ImplicitStartProcessor::ImplicitStartAbility3.1、GenerateAbilityRequestByAction3.1.1…...

antv/g6 图谱封装配置(二)

继上次实现图谱后&#xff0c;后续发现如果要继续加入不同样式的图谱实现起来太过麻烦&#xff0c;因此考虑将配置项全部提取封装到js文件中&#xff0c;图谱组件只专注于实现各种不同的组件&#xff0c;其中主要封装的点就是各个节点的横坐标&#xff08;x&#xff09;,纵坐标…...

OpenCV CUDA模块图像过滤------用于创建一个最小值盒式滤波器(Minimum Box Filter)函数createBoxMinFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数创建的是一个 最小值滤波器&#xff08;Minimum Filter&#xff09;&#xff0c;它对图像中每个像素邻域内的像素值取最小值。常用于&…...

网络抓包命令tcpdump及分析工具wireshark使用

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 8,Linux x86-64 Red Hat Enterprise Linux 7,Linux x86-64 SLES 12,银河麒麟 &#xff08;鲲鹏&#xff09;,银河麒麟 &#xff08;X86_64&#xff09;,银河麒麟&#xff08;龙…...

linux strace调式定位系统问题

strace 的基本功能 strace 的主要功能包括&#xff1a; 跟踪系统调用&#xff1a;显示进程执行时调用的系统函数及其参数和返回值。监控信号&#xff1a;记录进程接收到的信号。性能分析&#xff1a;统计系统调用的执行时间和次数。调试支持&#xff1a;帮助定位程序崩溃、性…...

femap许可与云计算集成

随着云计算技术的迅猛发展&#xff0c;越来越多的企业开始将关键应用和服务迁移到云端&#xff0c;以享受其带来的弹性扩展、高效管理和成本优化等优势。Femap作为一款强大的电磁仿真工具&#xff0c;通过与云计算的集成&#xff0c;将为企业带来前所未有的许可管理和仿真分析体…...

车载诊断架构 --- 车载诊断有那些内容(上)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

【Hadoop】大数据技术之 HDFS

目录 一、HDFS 概述 1.1 HDFS 产出背景及定义 1.2 HDFS 优缺点 1.3 HDFS 组成架构 1.4 HDFS 文件块大小 二、HDFS 的Shell 操作 三、HDFS 的读写流程&#xff08;面试重点&#xff09; 3.1 HDFS 写数据流程 3.2 HDFS 读数据流程 四、DataNode 4.1 DataNode 的工作机制…...

聊一下CSS中的标准流,浮动流,文本流,文档流

在网络上关于CSS的文章中&#xff0c;有时候能听到“标准流”&#xff0c;“浮动流”&#xff0c;“定位流”等等词语&#xff0c;还有像“文档流”&#xff0c;“文本流”等词&#xff0c;这些流是什么意思&#xff1f;它们是CSS中的一些布局方案和特性。今天我们就来聊一下CS…...

ATGM332D-F8N22单北斗多频定位导航模块

ATGM332D-F8N 系列模块是 12.216mm 尺寸的高性能单北斗多频定位导航模块。该系列模块产品基于中科微新一代 SOC 单北斗多频芯片 AT9880B&#xff0c;支持北斗二号和北斗三号的 B1I、B1C、B2I、B3I、B2a 和 B2b 频点信号。 主要特征 多频点单北斗接收机 支持北斗二号、北斗三号…...

2024年热门AI趋势及回顾

人工智能的崛起 2024 年可能会被铭记为人工智能不再是一种技术新奇事物&#xff0c;而是成为现实的一年。微软、Salesforce 和 Intuit 等巨头将人工智能融入主流企业解决方案&#xff1b;从文案写作到数据分析&#xff0c;专门的人工智能应用程序和服务如雨后春笋般涌现&#…...

【信息系统项目管理师】第20章:高级项目管理 - 28个经典题目及详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...

3. OpenManus-RL中使用AgentGym建立强化学习环境

AgentGym概述 AgentGym是为评估和开发大模型agent而设计的支持多环境和多任务的框架。该框架统一采用ReAct格式&#xff0c;提供多样化的交互环境和任务&#xff0c;支持实时反馈和并发操作。 What is Ai Agent&#xff08;基于大模型的智能体&#xff09;? 首先是人造实体&…...

C++性能测试工具——sysprof的使用

一、sysprof sysprof相对于前面的一些性能测试工具来说&#xff0c;要简单不少。特别是其图形界面的操作&#xff0c;非常容易上手&#xff0c;它还支持分析文件的保存和导入功能&#xff0c;这是一个非常不错的功能。做为一款系统性能测试工具&#xff0c;它支持多种硬件平台…...

JavaScript性能优化实战(13):性能测试与持续优化

在前面的系列文章中,我们探讨了各种JavaScript性能优化的方法和实战案例。然而,优化工作不应仅是一次性的努力,而应当成为开发流程中的常态。本篇将聚焦于如何建立系统化的性能测试体系,并实现持续的性能优化机制,确保应用长期保持出色的性能表现。 前端性能测试体系构建…...

questions and answers_1

TCP 长连接和短连接有什么区别&#xff1f; TCP 短连接是指客户端与服务端连接后只进行一次读写就关闭连接&#xff0c;一般是客户端关闭。 而长连接则是指在进行完一次读写后不关闭连接&#xff0c;直到服务端压力过大则选择关闭一些长时间为进行读写的连接。 TCP 短连接的优…...

树莓派内核源码的下载,配置,编译和替换

共享文件夹的创建 ubuntu创建共享文件夹可以实现和本地windows跨系统文件共享 下面是创建步骤 先在windows准备一个文件夹来当做共享文件夹 树莓派内核源码下载 1.在树莓派终端输入以下指令查看内核版本 uname -r我这里是已经编译替换过后的版本 2.选择树莓派对应的版本号下…...

CentOS停止维护了,解决yum不能安装软件的问题

最近在使用CentOS的yum命令安装软件时&#xff0c;出现了如下错误&#xff1a; 原因&#xff1a; 这是因为CentOS在2024 年 6 月 30 日停止维护了&#xff0c;同时也移除了相关的软件镜像仓库&#xff0c;导致网站地址访问不了&#xff0c;从而下载不了软件。 解决方法&#xf…...

过压保护电路设计和计算

设备供电电压因各种原因变得过高会烧坏设备,因此可以在前级加过压保护电路。 稳压二极管+PMOS 电路分析 1、当输入电压 Vin < 5.1V 时:(下图以输入电压 Vin = 5V 举例) D1是5.1V稳压管,此时输入电压Vin才5V,小于5.1V,所以稳压管D1未进入稳压状态,不导通。 5.1V稳…...

20250523-BUG:无法加载“GameLib/Framework.h“头文件(已解决)

BUG&#xff1a;无法加载"GameLib/Framework.h"头文件&#xff08;已解决&#xff09; 最近在打开新的C项目时报了这个错&#xff0c;我是按照以下步骤来排除的BUG&#xff0c;希望对您有所帮助~ 检查【C/C】-【附加包含目录】中的路径有无问题&#xff0c;一般需要加…...

OpenCv高阶(8.0)——答题卡识别自动判分

文章目录 前言一、代码分析及流程讲解&#xff08;一&#xff09;初始化模块正确答案映射字典&#xff08;题目序号: 正确选项索引&#xff09;图像显示工具函数 &#xff08;二&#xff09;轮廓处理工具模块&#xff08;三&#xff09;几何变换核心模块 二、主处理流程图像读取…...

Python语法特点与编码规范

注释 单行注释 把#号当做注释符号 多行注释 python中并没有规定多行注释标记&#xff0c;通常使用单引号作为多行注释 中文注释 规定文件所用编码&#xff0c;当时是为解决python2不支持中文的问题 #codingutf-8代码缩进 python采用代码缩进和冒号区分代码层次&#xff0c…...

反本能---如何对抗你的习以为常

目录 一、概述 二、自我提升 &#xff08;一&#xff09;我们为什么总想拖延 &#xff08;二&#xff09;如何有效应对拖延 &#xff08;三&#xff09;如何更好的自我控制 &#xff08;四&#xff09;为啥付出了没有回报 &#xff08;五&#xff09;如何提高学习效率 三…...

为什么信号经过线束会有衰减?

信号在线束&#xff08;电线、电缆&#xff09;中传播时会发生衰减&#xff0c;通俗来说就像 “能量在路上被慢慢消耗”&#xff0c;可以用几个生活中的类比来理解&#xff1a; 1. 线束本身的 “阻力”—— 电阻损耗 类比&#xff1a;就像水流过水管时&#xff0c;水管内壁粗糙…...