讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

updream

一键生成高质量推广成片

Java常用集合框架类库与List、Map

浅辰酱_2506

浅辰酱_2506

发布时间:2026-01-11 16:53:11

|

720人浏览过

|

来源于php中文网

原创

选择关键看操作模式:随机访问多用ArrayList(O(1)),中间增删多用LinkedList(O(1)插入删除);误用是用for循环遍历LinkedList导致O(n²)。

java常用集合框架类库与list、map

ArrayList 和 LinkedList 的选择关键看操作模式

不是“ArrayList 更快所以默认用它”,而是得看你的主要操作是随机访问多,还是频繁在中间增删多。ArrayList 底层是数组,get(i) 是 O(1),但 add(index, e) 或 remove(index) 在中间位置会触发数组拷贝,平均 O(n);LinkedList 是双向链表,按索引查元素要从头或尾遍历,get(i) 是 O(n),但 addFirst、addLast、以及已有 ListIterator 时的插入/删除都是 O(1)。

常见误用:for (int i = 0; i 配合 <code>LinkedList —— 这会变成 O(n²)。改用增强 for 循环或迭代器即可避免。

  • 读多写少、需要下标快速访问 → 选 ArrayList
  • 高频头/尾插入、已有迭代器且需边遍历边删 → LinkedList 仍有价值(但注意 JDK 21+ 中 SequencedCollection 接口让 ArrayList 也支持高效头插语义)
  • 别为了“看起来更通用”而声明为 LinkedList 却只用 add(e) 和 get(i)

HashMap 的线程不安全体现在哪?ConcurrentHashMap 怎么规避

HashMap 在多线程 put 时可能触发扩容重哈希,若两个线程同时判断需扩容、又同时执行 transfer()(JDK 7)或 split()(JDK 8),会导致链表成环(JDK 7)或数据丢失(JDK 8+)。这不是“偶尔错”,而是明确未定义行为,get() 可能死循环或返回 null。

ConcurrentHashMap 不是简单加锁整张表:JDK 7 用分段锁(Segment 数组),JDK 8 改为 CAS + synchronized 控制单个桶(Node 链表头或红黑树根),写操作只锁必要范围,读操作完全无锁。

javascript-typescript-typescript-scaffold
javascript-typescript-typescript-scaffold

你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

下载

立即学习“Java免费学习笔记(深入)”;

  • 只要没显式要求强一致性(如“所有线程立刻看到最新值”),ConcurrentHashMap 比 Collections.synchronizedMap(new HashMap()) 并发吞吐高得多
  • computeIfAbsent() 是原子的,适合缓存场景;但 map.get(key) == null ? map.put(key, compute()) : map.get(key) 是经典竞态,必须换用原子方法
  • size() 在并发下是弱一致的(可能滞后),如需精确计数,考虑 mappingCount()(返回 long,更准确)

ArrayList.subList() 返回的是视图,不是新集合

subList(fromIndex, toIndex) 返回的是原 ArrayList 的一个动态视图,底层共享同一份 elementData 数组。对子列表的结构性修改(如 add()、clear())会直接影响原列表,反之亦然。

ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d"));
List<String> sub = list.subList(1, 3); // ["b", "c"]
sub.add("x"); // list 变成 ["a", "b", "c", "x", "d"]
list.remove(0); // sub 变成 ["c", "x", "d"] —— 注意 sub.size() 现在是 3!
  • 需要独立副本?显式构造:new ArrayList(list.subList(from, to))
  • 传给不可信 API 时尤其危险:对方调 clear() 会清空你原列表的一部分
  • 子列表的 indexOf()、contains() 正常工作,但 retainAll() 这类结构性操作要格外小心

Map 接口里 keySet()、values()、entrySet() 的性能与用途差异

三者都返回视图,不复制数据,但迭代成本不同:entrySet() 是最高效的遍历方式,一次拿到 key 和 value;keySet() 迭代后若还需取 value,每次 map.get(key) 是额外哈希查找;values() 无法反查 key,且某些 Map 实现(如 IdentityHashMap)的 values 视图甚至不保证顺序或唯一性。

典型低效写法:for (String key : map.keySet()) { String value = map.get(key); ... } —— 多了一倍哈希计算。

  • 只关心 key?用 keySet()
  • 只关心 value?用 values(),但注意它不支持 remove()(除非是 LinkedHashMap 的 values 视图)
  • 要同时用 key 和 value?必须用 entrySet(),且优先用 Map.Entry::getKey 和 Map.Entry::getValue
  • HashMap 的 values() 视图在并发修改时可能抛 ConcurrentModificationException,和 keySet/entrySet 一样
实际项目里最容易被忽略的,是 subList() 的视图语义和 entrySet() 的遍历必要性——它们不报错,但会在数据规模上去后突然暴露性能或逻辑问题。

热门AI工具

更多
函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7559

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

569

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7559

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3585

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4728

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

3145

2025.08.29

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3248

2023.10.19

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn