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

Java 的集合都有哪些,都有什么特点?

hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶

面试资料大全|各种技术资料-2000G

一、集合框架总体结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二、主要接口分类

1. Collection 接口(单列集合)

(1) List 接口(有序、可重复)
  • ArrayList

    • 基于动态数组
    • 随机访问快(O(1))
    • 增删慢(需要移动元素)
    • 线程不安全
    • 默认初始容量10,扩容1.5倍
  • LinkedList

    • 基于双向链表
    • 增删快(O(1))
    • 随机访问慢(O(n))
    • 实现了Deque接口,可作为队列使用
  • Vector

    • 线程安全的ArrayList(方法同步)
    • 性能较差
    • 默认扩容2倍
  • Stack(已过时):

    • 继承自Vector
    • LIFO(后进先出)结构
(2) Set 接口(无序、唯一)
  • HashSet

    • 基于HashMap实现
    • 元素无序
    • 允许null值
    • 基本操作时间复杂度O(1)
  • LinkedHashSet

    • 继承HashSet
    • 维护插入顺序的链表
    • 迭代性能更好
  • TreeSet

    • 基于TreeMap(红黑树)
    • 元素自然排序或自定义排序
    • 基本操作时间复杂度O(log n)
(3) Queue 接口(队列)
  • PriorityQueue

    • 基于优先级堆
    • 元素按自然顺序或Comparator排序
    • 不允许null值
  • ArrayDeque

    • 基于可扩容循环数组
    • 双端队列实现
    • 比LinkedList更高效

2. Map 接口(双列集合,键值对)

  • HashMap

    • 数组+链表+红黑树(JDK8)
    • 允许null键和null值
    • 非线程安全
    • 默认负载因子0.75
  • LinkedHashMap

    • 继承HashMap
    • 维护插入顺序或访问顺序
    • 适合实现LRU缓存
  • TreeMap

    • 基于红黑树
    • 键自然排序或自定义排序
    • 基本操作时间复杂度O(log n)
  • Hashtable

    • 线程安全的Map实现
    • 方法同步,性能较差
    • 不允许null键和null值
  • ConcurrentHashMap

    • 线程安全的HashMap
    • JDK8采用CAS+synchronized
    • 高并发性能好

三、各集合类对比

List 实现类对比

特性ArrayListLinkedListVector
底层结构动态数组双向链表动态数组
随机访问快(O(1))慢(O(n))快(O(1))
增删效率慢(O(n))快(O(1))慢(O(n))
线程安全不安全不安全安全(synchronized)
扩容1.5倍无需扩容2倍

Set 实现类对比

特性HashSetLinkedHashSetTreeSet
底层实现HashMapLinkedHashMapTreeMap
元素顺序无序插入顺序排序顺序
null值允许允许不允许(取决于Comparator)
时间复杂度O(1)O(1)O(log n)

Map 实现类对比

特性HashMapLinkedHashMapTreeMapHashtableConcurrentHashMap
底层结构数组+链表+红黑树同上+双向链表红黑树数组+链表数组+链表+红黑树
顺序无序插入/访问顺序键排序无序无序
null键值允许允许键不能为null不允许不允许
线程安全不安全不安全不安全安全(synchronized)安全(CAS+synchronized)
锁粒度---整个表桶级别

四、线程安全集合方案

  1. 传统线程安全集合

    • Vector
    • Hashtable
    • Stack
  2. Collections工具类包装

    List<String> syncList = Collections.synchronizedList(new ArrayList<>());
    Map<String, String> syncMap = Collections.synchronizedMap(new HashMap<>());
    
  3. JUC并发集合(推荐)

    • ConcurrentHashMap
    • CopyOnWriteArrayList
    • CopyOnWriteArraySet
    • ConcurrentLinkedQueue
    • ConcurrentSkipListMap
    • ConcurrentSkipListSet

五、选择集合的最佳实践

  1. 单列集合选择

    • 需要快速随机访问 → ArrayList
    • 频繁增删 → LinkedList
    • 需要去重 → HashSet
    • 需要有序去重 → LinkedHashSetTreeSet
    • 需要排序 → TreeSet
  2. 键值对集合选择

    • 一般用途 → HashMap
    • 需要保持插入顺序 → LinkedHashMap
    • 需要键排序 → TreeMap
    • 高并发环境 → ConcurrentHashMap
  3. 队列选择

    • 一般队列 → LinkedListArrayDeque
    • 优先级队列 → PriorityQueue
    • 高并发队列 → ConcurrentLinkedQueue

六、Java 8 对集合的增强

  1. Stream API

    list.stream().filter(s -> s.startsWith("A")).collect(Collectors.toList());
    
  2. forEach方法

    map.forEach((k, v) -> System.out.println(k + ": " + v));
    
  3. Map新方法

    map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
    map.getOrDefault(key, defaultValue);
    map.merge(key, value, (oldVal, newVal) -> oldVal + newVal);
    
  4. 性能优化

    • HashMap链表长度>8时转为红黑树
    • ConcurrentHashMap放弃分段锁,改用CAS+synchronized
面试资料大全|各种技术资料-2000G

在这里插入图片描述

http://www.dtcms.com/a/274907.html

相关文章:

  • c#获取Datatable中某列最大或最小的行数据方法
  • 2025年亚太中文赛B题第一版本超详细解题思路
  • Claude Code 完全上手指南:从入门到精通的终极备忘录
  • 【MYSQL8】springboot项目,开启ssl证书安全连接
  • 深度学习篇---昇腾NPUCANN 工具包
  • 数字后端APR innovus sroute到底是如何选取宽度来铺power rail的?
  • 大模型遇上数据库:如何真正实现从“智能问数”到“精准问数”?Intalink给出答案
  • Rust基础-part3-函数
  • 如何在 PyCharm 批量调整代码缩进?PyCharm 调整代码格式化和代码缩进的快捷键有哪些?
  • Pandas:常见的转换函数(rename,set_index,reset_index)
  • 麦迪逊悬架cad【14张】+三维图+设计说明书
  • VLLM部署DeepSeek-LLM-7B-Chat 模型
  • 云网络产品
  • 简单记录一下Debug的折磨历程
  • 多项式环及Rq的含义
  • Solaris10 创建用户初始化家目录
  • 注意力机制十问
  • softmax回归的从零开始实现
  • Java 抽象类详解:从基础到实战,掌握面向对象设计的核心基石
  • 渗透测试之木马后门实验
  • 拥抱AI----AI时代下的SSM框架
  • 项目捷报 | 冠捷科技泰国工厂THA MES项目成功验收!TPV国际化布局再添里程碑!
  • 【中文核心期刊推荐】中国农业科技导报
  • php的原生类
  • 7.12 卷积 | 最小生成树 prim
  • 转转APP逆向
  • WIFI协议全解析06:Beacon帧、Probe帧你必须懂,搞WiFi通信绕不开它们
  • RAG知识库检索查询优化技术
  • 【实时Linux实战系列】 KVM-RT 与 Jailhouse 虚拟化
  • C++ 面向对象 - 默认值与常量成员