java容器 LIst、set、Map

Java容器中的List、Set、Map是核心数据结构,各自适用于不同的场景

一、List(有序、可重复)

List接口代表有序集合,允许元素重复和通过索引访问,主要实现类包括:

ArrayList

底层结构:动态数组实现。
特点:支持快速随机访问(时间复杂度O(1)),但插入/删除元素时需要移动数组,效率较低(时间复杂度O(n))。
适用场景:读多写少,需频繁按索引查询的场景,如数据缓存。

LinkedList

底层结构:双向链表实现。
特点:插入/删除效率高(时间复杂度O(1)),但随机访问效率低(需遍历链表,时间复杂度O(n))。
扩展功能:可用作栈(push/pop)或队列(offer/poll)。

Vector & Stack

线程安全:通过synchronized实现同步,但性能较低,已被CopyOnWriteArrayList取代。
Stack:基于数组的栈结构,但官方推荐用Deque接口替代。

CopyOnWriteArrayList

并发安全:写操作时复制新数组,读操作无锁,适合读多写少的高并发场景。
缺点:内存占用高,数据可能延迟更新。

二、Set(无序、不可重复)

Set接口要求元素唯一性,主要实现类包括:

HashSet

底层结构:基于HashMap实现,哈希表存储元素。
特点:插入/查询效率高(时间复杂度O(1)),元素无序。

LinkedHashSet

扩展特性:维护插入顺序的双向链表,适合需要保持顺序的集合。

TreeSet

底层结构:基于红黑树实现,元素按自然顺序或自定义比较器排序。
特点:插入/查询效率较低(时间复杂度O(log n)),但支持范围查询。

CopyOnWriteArraySet

并发安全:基于CopyOnWriteArrayList,通过addIfAbsent保证元素唯一性。

三、Map(键值对存储)

Map接口存储键值对(Key-Value),键唯一,主要实现类包括:

HashMap

底层结构:数组+链表/红黑树(JDK8优化冲突处理)。
特点:非线程安全,允许null键/值,查询效率高(平均O(1))。

LinkedHashMap

扩展特性:维护插入顺序或LRU(最近最少使用)顺序。

TreeMap

底层结构:红黑树实现,键按自然顺序或自定义排序。
适用场景:需有序遍历键的场景,如排序字典。

ConcurrentHashMap

并发优化:JDK8后采用CAS和分段锁,替代Hashtable。
特点:高并发下性能优于同步容器,适合多线程环境。

HashTable

遗留类:全表锁导致性能低,不推荐使用

四、场景应用

容器有序性重复性线程安全典型应用场景
ArrayList是(插入顺序)允许否(需并发容器)高频随机访问的静态数据
LinkedList是(插入顺序)允许频繁插入/删除的队列或栈
HashSet禁止否(需并发容器)快速去重的无序集合
TreeSet是(自然排序)禁止需要排序或范围查询的集合
HashMap键唯一否(需ConcurrentHashMap)高频键值查询的非同步场景
ConcurrentHashMap键唯一是(分段锁/CAS)高并发键值存储

五、设计模式与底层原理

迭代器模式:所有容器均实现Iterable接口,通过Iterator遍历元素,支持forEach循环。
适配器模式:如Arrays.asList()将数组适配为List。
写时复制:CopyOnWriteArrayList通过复制新数组实现并发安全,减少锁竞争。

实际使用根据业务场景决定。

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

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

相关文章

3471. 找出最大的几近缺失整数

3471. 找出最大的几近缺失整数 class Solution:# 辅助方法,判断第三种情况,只有首位两个元素有可能为最大几近缺失数def f(self,nums,x):return -1 if x in nums else xdef largestInteger(self, nums: List[int], k: int) -> int:n len(nums)if k …

【异常错误】No module named ‘taming.modules.vqvae‘

错误&#xff1a; File "/mnt/d/Pycharm_workspace/text2image/OmniGen-version/OmniGen/latentDiffusion/ldm/models/autoencoder.py", line 6, in <module> from taming.modules.vqvae.quantize import VectorQuantizer2 as VectorQuantizer ModuleNotF…

快检查达梦库怎么了

扁鹊的弟弟来了 要求5分钟定位达梦数据库问题 #!/bin/bash## content 实例个数 告警日志 实例状态 用户连接 活动会话 锁 集群状态 服务状态 磁盘空间 cpu mem 侦听及日志 ## scope 单机、DW、DSC Linux 多实例 ## example 将脚本保存为d.sh&#xff0c;用root用执行&#…

C++20中`constexpr`的显著增强

文章目录 1. **更多标准库函数支持constexpr**2. **支持动态内存分配**3. **支持虚函数和多态**4. **支持try-catch异常处理**5. **更灵活的控制流**6. **支持std::initializer_list**7. **支持修改union活跃成员**8. **允许更多类型的非类型模板参数**总结 C20对 constexpr进…

Tomcat 乱码问题彻底解决

1. 终端乱码问题 找到 tomcat 安装目录下的 conf —> logging.properties .修改ConsoleHandler.endcoding GBK &#xff08;如果在idea中设置了UTF-8字符集&#xff0c;这里就不需要修改&#xff09; 2. CMD命令窗口设置编码 参考&#xff1a;WIN10的cmd查看编码方式&…

以太坊测试网

文章目录 什么是测试网如何使用测试网获取测试以太币 什么是测试网 测试网&#xff08;Testnet&#xff09;是一个模拟以太坊主网&#xff08;Mainnet&#xff09;行为的区块链网络。它允许开发人员和用户在不使用真实资金的情况下测试智能合约和应用程序。虽然测试网上的代币…

算法随笔_62: 买卖股票的最佳时机

上一篇:算法随笔_61:二进制求和-CSDN博客 题目描述如下: 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获…

腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析

腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;对比分析 腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;作为当前文生图领域的两大代表模型&#xff0c;各自…

【HTML—前端快速入门】HTML 基础

准备工作 vscode下载 百度网盘 Subline Text 下载 Sublime Text下载 百度网盘 vscode 下载 Sublime Text 是一款轻量好用的文本编辑器&#xff0c;我们在写前端代码时&#xff0c;使用 Sublime Text 打开比使用记事本打开&#xff0c;得到的代码体验更好&#xff0c;比 vscode…

基于单片机的GPS定位系统设计

1 系统硬件 1.1单片机模块 单片机的种类和型号可以说是有成百上千种&#xff0c;很多大的公司和企业都生产开发自己的单片机芯片&#xff0c;并且广泛应用于各种产品。Intel、 philips、 摩托罗拉、凌阳、宏晶等等种类繁多。大体上可以分为51系列单片机和非51系列单片机。 其…

对大模型输出的 logits 进行处理,从而控制文本的生成

对大模型输出的 logits 进行处理&#xff0c;从而控制文本的生成 flyfish 在文本生成任务中&#xff0c;模型输出的 logits 代表了每个词被选为下一个生成词的未归一化概率得分。通过对 logits 进行处理&#xff0c;可以精确地控制文本的生成 基本原理 在每一步生成过程中&…

Reids缓存穿透、缓存雪崩和缓存击穿

Redis缓存中常见的三个问题&#xff1a;缓存穿透、缓存雪崩和缓存击穿。这些问题在使用Redis作为缓存时经常遇到&#xff0c;但通过合理的策略可以有效解决。我会用简单易懂的方式来讲解&#xff0c;帮助你理解这些问题的原理和解决方案。 1. 缓存穿透 1.1 什么是缓存穿透&…

附录-Python — 包下载缓慢,配置下载镜像

1️⃣命令行配置 pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/ pip config set install.trusted-host mirrors.aliyun.com 2️⃣配置文件配置 1、打开文件夹&#xff0c;输入 %APPDATA% 回车 2、打开 %APPDATA% 路径&#xff0c;并在此路径下新建…

VS 2019 免费版 下载与安装 教程说明

推荐大家直接转到第13步&#xff0c;点击链接即可下载VS2019版本 1.VS官网 2.登录账号 3.在搜索栏输入“2019” 4.点击2019这个标题 5.点击“下载” 6.选择合适的版本下载 7.打开下载文件&#xff08;若下载过程总是转圈圈&#xff0c;则换个网络下载即可&#xff09; 8.安…

介绍 torch-mlir 从 pytorch 生态到 mlir 生态

一、引言 The Torch-MLIR project provides core infrastructure for bridging the PyTorch ecosystem and the MLIR ecosystem. For example, Torch-MLIR enables PyTorch models to be lowered to a few different MLIR dialects. Torch-MLIR does not attempt to provide a…

Java并发编程之ConcurrentHashMap的原理和使用

ConcurrentHashMap(CHM)是Java为解决高并发场景下哈希表性能瓶颈而设计的线程安全容器,其核心目标在于: 线程安全‌:避免多线程操作导致的数据不一致问题‌;高吞吐量‌:通过细粒度锁和无锁化设计降低线程竞争‌;动态扩展‌:支持自动扩容与数据结构优化(如链表转红黑树…

AbMole揭秘伤口愈合:IGF-1-SP1-CD248信号通路的新发现

科学家们揭示了一条新的信号通路——IGF-1-SP1-CD248&#xff0c;这一发现为理解伤口愈合障碍提供了新的视角&#xff0c;并为未来的研究开辟了新方向。 研究背景 糖尿病患者的伤口愈合是一个长期存在的挑战。据统计&#xff0c;约15%的糖尿病患者会遭受慢性伤口的困扰&#…

Go入门之文件

以只读方式打开文件 package mainimport ("fmt""io""os" )func main() {file, err : os.Open("./main.go")defer file.Close()if err ! nil {fmt.Println(err)return}fmt.Println(file)var tempSlice make([]byte, 128)var strSlice…

python量化交易——金融数据管理最佳实践——使用qteasy管理本地数据源

文章目录 统一定义的金融历史数据表最重要的数据表数据表的定义交易日历表的定义&#xff1a;交易日历表: trade_calendar qteasy是一个功能全面且易用的量化交易策略框架&#xff0c; Github地址在这里。使用它&#xff0c;能轻松地获取历史数据&#xff0c;创建交易策略并完…

通过 PromptTemplate 生成干净的 SQL 查询语句并执行SQL查询语句

问题描述 在使用 LangChain 和 Llama 模型生成 SQL 查询时&#xff0c;遇到了 sqlite3.OperationalError 错误。错误信息如下&#xff1a; OperationalError: (sqlite3.OperationalError) near "sql SELECT Name FROM MediaType LIMIT 5; ": syntax error [SQL: …