"/>
侧边栏壁纸
博主头像
PySuper 博主等级

千里之行,始于足下

  • 累计撰写 286 篇文章
  • 累计创建 17 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Java 集合

PySuper
2022-10-15 / 0 评论 / 0 点赞 / 17 阅读 / 0 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

一、集合 & 数组

核心区别

特性

数组

集合

类型支持

基本类型/对象

仅对象(需包装类)

容量

固定长度

动态扩容(如ArrayList)

性能

随机访问O(1)(内存连续)

部分操作效率低(如LinkedList随机访问O(n))

功能

基础操作(赋值、遍历)

丰富API(排序、过滤、线程安全工具)

适用场景

数据量固定、性能敏感

动态数据、复杂操作

常见集合类型

  • List:有序、可重复(如ArrayList、LinkedList)

  • Set:无序、唯一(如HashSet、TreeSet)

  • Map:键值对(如HashMap、ConcurrentHashMap)

1. 区别

  • 类型与泛型

    • 数组:声明时必须明确元素类型(如 int[]、String[]),只能存储同类型元素(基本类型或引用类型)

    • 集合:默认以 Object 存储元素,支持泛型(如 List<String>)增强类型安全,未用泛型时可混合类型

  • 容量与动态性

    • 数组:长度固定,无法扩容,需手动处理增删(如复制数组)

    • 集合:动态扩容(如 ArrayList),提供 add()、remove() 等灵活操作

  • 性能与内存

    • 数组:内存连续分配,索引访问 O(1),适合高频访问

    • 集合:底层结构多样(链表、哈希表等),部分操作效率低(如 LinkedList 随机访问为 O(n))

  • 功能扩展

    • 数组:仅支持基础操作(赋值、遍历)

    • 集合:提供排序(Collections.sort())、过滤(Stream.filter())、线程安全工具(如 Collections.synchronizedList())等丰富 API

  • 适用场景

    • 数组:数据量固定、性能敏感场景(数学计算、固定配置项)

    • 集合:数据动态变化、需复杂操作的场景(订单管理、用户日志)

2. 类型

  • List(有序、可重复)

    • ArrayList:基于动态数组,快速随机访问,适合读多写少(商品列表展示)

    • LinkedList:基于双向链表,插入/删除高效,适合频繁增删(消息队列)

  • Set(无序、唯一)

    • HashSet:基于哈希表,查找 O(1),适合去重或快速查找(用户黑名单)

    • TreeSet:基于红黑树,自动排序,适合有序唯一需求(排行榜)

  • Map(键值对)

    • HashMap:非线程安全,允许 null 键值,适合高频读写(缓存数据)

    • ConcurrentHashMap:线程安全,适合高并发(分布式计数器)

  • 其他工具类

    • Collections:提供集合工具方法(排序、同步化包装)

    • Arrays:提供数组工具方法(asList()、sort())

3. 使用

  • 动态数据管理:用 ArrayList<FormData> 存储用户表单数据,通过泛型保证类型一致

  • 高频查询优化:用 HashMap 缓存数据库结果(如用户ID到对象的映射),减少重复查询

  • 并发场景处理:多线程下用 ConcurrentHashMap 替代 Hashtable,兼顾性能与线程安全

4. 总结

  • 选择依据:优先考虑数据量是否固定、是否需要动态操作、线程安全及性能需求

  • 推荐实践:默认使用集合(如 ArrayList、HashMap),仅在数据量固定或追求极致性能时用数组

二、Java中的集合

1. 接口 & 实现类

  • Collection接口

    • List(有序、可重复)

    • ArrayList:基于动态数组,快速随机访问(O(1)),适合读多写少(如商品列表)

    • LinkedList:基于双向链表,插入/删除高效(O(1)),适合频繁增删(如消息队列)

    • Vector:线程安全的动态数组,性能较低,逐渐被 ArrayList 替代

  • Set(无序、唯一)

    • HashSet:基于哈希表,查找 O(1),适合去重或快速查找(如用户黑名单)

    • TreeSet:基于红黑树,元素自动排序,适合有序唯一需求(如排行榜)

  • Queue(队列)

    • LinkedList:支持队列(FIFO)和栈(LIFO)

    • PriorityQueue:基于优先级堆,元素按优先级排序

  • Map接口(键值对)

  • HashMap:非线程安全,允许 null 键值,适用于高频读写(如缓存)

  • ConcurrentHashMap:线程安全,分段锁机制,适合高并发场景

  • TreeMap:基于红黑树,键自动排序,适合有序键场景(如按日期排序日志)

2. 集合 & 数组

特性

数组

集合

类型支持

支持基本类型和对象

仅支持对象(需通过包装类处理基本类型)

容量动态性

固定长度

动态扩容(如 ArrayList 自动扩展)

性能

内存连续,随机访问 O(1)

数据结构多样(如链表 O(n) 访问)

功能扩展

仅基础操作

提供排序、过滤、线程安全等丰富 API

3. 线程安全 & 工具类

  • 线程安全实现

    • 同步容器:Vector、Hashtable(通过 synchronized 实现,性能低)

    • 并发容器:ConcurrentHashMap、CopyOnWriteArrayList(分段锁或写时复制技术)

  • 工具类

    • Collections:提供排序(sort())、查找(binarySearch())、同步化包装(synchronizedList())

    • Arrays:支持数组转换(asList())、排序(sort())

4. 设计原则 & 最佳实践

  • 泛型与类型安全

    • 集合通过泛型(如 List<String>)限制元素类型,避免运行时错误

  • 选择依据

    • 数据量固定:优先用数组(如数学计算)

    • 动态操作:优先用集合(如 ArrayList、HashMap)

    • 排序需求:使用 TreeSet 或 TreeMap

    • 并发场景:使用 ConcurrentHashMap 或 CopyOnWriteArrayList

  • 性能优化

    • 避免集合频繁扩容(如预初始化 ArrayList 容量)

    • 使用迭代器(Iterator)遍历,避免并发修改异常

5. 扩展 & 演进

  • 历史演进:Java 1.0 的 Vector、Hashtable 逐渐被 Java 2 集合框架替代

  • 函数式编程:Java 8 引入流(Stream)和 Lambda,支持链式操作(过滤、映射)

三、线程安全的集合

1. 传统同步集合

低并发场景

  • Vector:基于动态数组,所有方法用 synchronized 修饰,线程安全但性能低,适合简单场景

  • Hashtable:线程安全哈希表,不允许 null 键值,方法同步导致性能差,已被 ConcurrentHashMap 取代

  • Stack:继承自 Vector,实现后进先出(LIFO)的栈结构,同步机制与 Vector 一致

  • 同步包装类:通过 Collections.synchronizedList()、Collections.synchronizedMap() 包装普通集合为线程安全版本,但需手动同步复合操作(如迭代)

2. 并发集合

java.util.concurrent 包,高并发场景

  • ConcurrentHashMap:线程安全哈希表,JDK 1.8 前分段锁,之后改为 CAS + synchronized,支持高并发读写

  • CopyOnWriteArrayList/CopyOnWriteArraySet:写时复制(Copy-On-Write)机制,读多写少场景适用(如配置缓存)

  • ConcurrentLinkedQueue/ConcurrentLinkedDeque:无锁(CAS 实现)线程安全队列,适合高并发生产者-消费者模型

  • ConcurrentSkipListMap/ConcurrentSkipListSet:基于跳表(Skip List),支持有序键值对的线程安全操作(如排行榜)

3. 阻塞队列

BlockingQueue 接口实现类

  • ArrayBlockingQueue:基于数组的有界队列,通过 ReentrantLock 实现线程安全

  • LinkedBlockingQueue:基于链表的可选有界队列(默认无界),适合任务队列场景

  • PriorityBlockingQueue:无界优先级队列,元素按自然顺序或自定义 Comparator 排序

  • SynchronousQueue:不存储元素,直接传递任务,适用于线程间直接交换数据

4. 选择依据

  • 高并发读写:优先用 ConcurrentHashMap(Map)或 ConcurrentLinkedQueue(队列)

  • 读多写少:选择 CopyOnWriteArrayList 或 CopyOnWriteArraySet

  • 有序性需求:使用 ConcurrentSkipListMap 或 ConcurrentSkipListSet

  • 生产者-消费者模型:采用 BlockingQueue 实现类(如 LinkedBlockingQueue)

  • 兼容旧代码:临时用 Vector 或 Hashtable,但不推荐高并发场景

5. 注意事项

  • 复合操作安全性:即使使用线程安全集合,组合多个方法(如“检查-修改”)仍需额外同步

  • 迭代器行为:

    • ConcurrentHashMap 迭代器是弱一致性的

    • CopyOnWriteArrayList 迭代器基于快照,不会抛出 ConcurrentModificationException

  • 性能权衡:同步集合(如 Vector)适合低并发,并发集合(如 ConcurrentHashMap)高并发更优

四、Collections & Collection

1. 定义

  • Collection

    • Java 集合框架的根接口,定义集合的通用方法(如 add()、remove())

    • 所有集合类(List、Set、Queue)均直接或间接实现此接口

  • Collections

    • 工具类,提供静态方法操作集合(如排序、线程安全包装)

    • 不存储数据,仅增强集合功能

2. 功能

  • Collection

    • 规范集合行为,如 List(有序可重复)、Set(无序唯一)、Queue(队列)

    • 实现类包括 ArrayList、HashSet、PriorityQueue 等

  • Collections

    • 提供功能扩展:sort()(排序)、synchronizedList()(线程安全包装)、binarySearch()(二分查找)

3. 调用

  • Collection:实例方法:通过集合对象调用(如 list.add("Java"))

  • Collections:静态方法:直接通过类名调用(如 Collections.sort(list))

4. 子类

  • Collection:通过子接口(如 List、Set)和实现类扩展数据结构

  • Collections:无子类,所有方法独立存在,适用于任何 Collection 实现类

5. 线程安全

  • Collection:默认非线程安全(如 ArrayList、HashMap),需手动同步或使用并发集合(如 ConcurrentHashMap)

  • Collections:提供同步包装方法(如 Collections.synchronizedList(list)),但迭代时仍需手动加锁

6. 对比

对比项

Collection

Collections

类型

接口

工具类

方法类型

实例方法

静态方法

线程安全

默认不安全

提供同步包装方法

核心作用

定义数据结构规范

增强集合功能

五、集合遍历

人类迷惑行为大赏:

🚫 用普通 for 循环暴揍 LinkedList —— 疯狂跑腿,性能扑街

🚫 在增强 for 循环里删元素 —— 系统提示:您已触发「ConcurrentModificationException」成就

  • 原始人模式

    • 普通 for 循环:靠索引点名,List 专属,Set 直接装死

    • 增强 for 循环:无脑自动导航,但手贱删元素会原地爆炸(抛异常)

  • 智能导航

    • 迭代器:自带安检员,边逛边删不翻车,但只能一路向前(单向)

    • 列表迭代器:双向飙车特技,List 专属,还能改户口(修改元素)

  • 懒人套餐

    • forEach:一键清空购物车(遍历),但别想中途反悔(不支持 break)

    • Stream API:流水线魔法,边遍历边加工(过滤/统计/变形),附赠多线程加速包

  • Map 专场

    • entrySet:抄家式遍历(键值对一锅端),效率之王

    • keySet:先偷钥匙再开锁找值,适合眼神好的柯南

    • forEach:键值对一键打包,懒人直呼内行

  • 隐藏技能

    • Spliterator:分手大师,把集合拆成多段并行处理(Java 8 黑科技)

    • Enumeration:爷爷辈工具,如今只剩 Vector 等古董还在用

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区