讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java里List接口和Set接口有什么区别_Java集合类型对比说明

秋杰酱_2246

秋杰酱_2246

发布时间:2026-02-07 15:52:02

|

509人浏览过

|

来源于php中文网

原创

List允许重复且保留顺序,适合日志、队列;Set禁止重复、不保证顺序(除非LinkedHashSet/TreeSet),适合去重、权限校验;自定义对象入Set须重写hashCode()和equals();List支持索引访问,Set不支持;底层实现决定性能:ArrayList(数组)、LinkedList(链表)、HashSet(HashMap)、TreeSet(红黑树);均非线程安全,需显式同步。

在java里list接口和set接口有什么区别_java集合类型对比说明

元素是否允许重复?这是最根本的分水岭

如果你往 List 里加两次 "apple",它会老老实实存两个;但往 Set 里加两次,第二次会静默失败——add() 返回 false,集合长度不变。这不是 bug,是设计契约:List 是「序列」,Set 是「数学意义上的集合」。

  • List 允许重复 + 保留插入顺序 → 适合记录操作日志、消息队列、带索引的配置项
  • Set 禁止重复 + 不保证顺序(除非用 LinkedHashSet 或 TreeSet)→ 适合去重、权限校验、唯一ID缓存
  • 自定义对象进 Set 必须重写 hashCode() 和 equals(),否则哪怕内容相同也会被当成不同元素

能不能按索引取值?决定了你能否“随机访问”

List 支持 get(2)、set(0, "new")、indexOf("x") 这类基于下标的操作;Set 没有下标概念,连 get() 方法都没有。想遍历只能用 iterator() 或增强 for 循环。

  • 需要根据位置快速查/改数据?选 List(优先 ArrayList)
  • 只关心“有没有这个值”,不关心它在第几位?Set 更语义清晰,且 contains() 平均是 O(1)(HashSet)或 O(log n)(TreeSet),比 List.contains() 的 O(n) 快得多
  • 误写 mySet.get(0) 会直接编译报错——接口压根没定义这个方法

底层实现差异直接决定性能拐点

ArrayList 是数组,LinkedList 是双向链表,HashSet 底层其实是 HashMap(只用 key),TreeSet 是红黑树。这些不是 trivia,而是你选错就卡顿的根源。

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
  • 高频尾部增删 + 偶尔遍历?ArrayList 和 LinkedList 差距不大;但频繁中间插入?LinkedList 的 O(1) 优势才显现(不过实际中 JVM 优化和 cache 局部性常让 ArrayList 更快)
  • 大量 add() + 后续反复 contains()?别用 ArrayList 做去重,HashSet 是天然解法
  • 需要有序且去重?别先用 ArrayList 再 Collections.sort() + 手动去重,直接上 TreeSet 或 LinkedHashSet(按插入序)

线程安全不是默认选项,别指望接口帮你兜底

List 和 Set 接口本身都不承诺线程安全。所有常用实现(ArrayList、HashSet、LinkedHashSet、TreeSet)都是非线程安全的。曾经的 Vector 和 Hashtable 已淘汰,现在要用得靠 Collections.synchronizedList() 或 CopyOnWriteArrayList 等显式包装。

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

  • 多线程写同一个 ArrayList?可能抛 ConcurrentModificationException,也可能数据 silently 错乱
  • HashSet 在并发 add() 时可能因哈希冲突导致扩容死循环(JDK 7 及以前),JDK 8+ 改为红黑树缓解但仍未解决线程安全
  • 真要并发安全,优先考虑 ConcurrentHashMap 的 keySet 视图,或 CopyOnWriteArraySet(仅适用于读多写少场景)
Java 集合的坑往往不在语法,而在你把「能存」当成了「该这么存」——比如用 ArrayList 存用户 ID 做去重判断,既慢又易错;又比如往 HashSet 里扔没重写 hashCode() 的 DTO,结果发现重复提交永远过不去。这些都不是 API 不好用,是你没对齐它的设计意图。

热门AI工具

更多
豆包大模型

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

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

DeepSeek

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1138

2023.09.04

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

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

3188

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5089

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3829

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

466

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4418

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1229

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

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

423

2026.01.21

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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