一、集合 & 数组
核心区别
常见集合类型
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. 集合 & 数组
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. 对比
五、集合遍历
人类迷惑行为大赏:
🚫 用普通 for 循环暴揍 LinkedList —— 疯狂跑腿,性能扑街
🚫 在增强 for 循环里删元素 —— 系统提示:您已触发「ConcurrentModificationException」成就
原始人模式
普通 for 循环:靠索引点名,List 专属,Set 直接装死
增强 for 循环:无脑自动导航,但手贱删元素会原地爆炸(抛异常)
智能导航
迭代器:自带安检员,边逛边删不翻车,但只能一路向前(单向)
列表迭代器:双向飙车特技,List 专属,还能改户口(修改元素)
懒人套餐
forEach:一键清空购物车(遍历),但别想中途反悔(不支持 break)
Stream API:流水线魔法,边遍历边加工(过滤/统计/变形),附赠多线程加速包
Map 专场
entrySet:抄家式遍历(键值对一锅端),效率之王
keySet:先偷钥匙再开锁找值,适合眼神好的柯南
forEach:键值对一键打包,懒人直呼内行
隐藏技能
Spliterator:分手大师,把集合拆成多段并行处理(Java 8 黑科技)
Enumeration:爷爷辈工具,如今只剩 Vector 等古董还在用
评论区