Java集合处理
Java集合本质是用来存储多个对象的容器,区别于数组:数组长度固定、只能存同类型元素、既有基本类型也能存引用类型;集合长度可变、只存引用数据类型、提供大量增删改查工具方法,是开发中最常用的数据容器,整体分为两大根接口: Collection (单列集合,单个元素存储)、 Map (双列集合,键值对 key-value 存储)。
一、Collection 单列集合(存单个元素)
顶层接口,无法直接实例化,下分三大子接口: List 、 Set 、 Queue
- List 有序可重复集合(存入顺序和取出顺序一致,允许元素重复、支持下标索引)
核心实现类:ArrayList、LinkedList、Vector
1. ArrayList(日常最常用)
底层:动态数组,连续内存空间
优点:支持随机索引查询(get(index) 极快)、遍历效率极高
缺点:中间插入/删除元素需要移动大量元素,效率低
适用场景:查询多、增删少(90%业务场景首选),线程不安全
2. LinkedList
底层:双向链表,非连续内存
优点:头尾增删速度极快,不需要移动元素
缺点:没有索引,随机查询必须从头遍历,查询很慢
适用场景:首尾频繁增删、实现栈/队列结构,线程不安全
3. Vector
底层数组,所有方法加 synchronized 同步锁,线程安全,但并发性能极差,基本淘汰不用。
- Set 无序不可重复集合(无下标、元素唯一、存取顺序不一定一致)
依靠 equals() + hashCode() 两个方法去重:两个对象hash值相同且equals相等才判定重复
1. HashSet(最常用)
底层:哈希表(数组+链表+红黑树)
特点:完全无序、去重、查询插入速度极快,线程不安全
原理:先算元素hash值定位数组下标,hash冲突则挂链表,链表长度超8转为红黑树优化查询
2. LinkedHashSet
继承HashSet,额外维护双向链表记录插入顺序
特点:有序、去重,性能略低于HashSet,需要有序且去重时使用
3. TreeSet
底层红黑树(平衡二叉树)
特点:元素自动升序排序、去重;元素必须实现Comparable接口或传入Comparator比较器;查询增删效率均衡
适用:需要自动排序的唯一元素场景
- Queue 队列(先进先出FIFO,多用于任务排队、消息队列)
- ArrayDeque:数组实现双端队列,可做栈、普通队列,性能优于LinkedList
- PriorityQueue:优先队列,底层堆结构,元素按优先级出队
二、Map 双列集合(键值对存储 key=value,key唯一,value可重复,无继承Collection)
所有Map都不允许key重复,key重复会覆盖旧value,常用实现:HashMap、LinkedHashMap、TreeMap、Hashtable
1. HashMap(开发首选)
底层:哈希表(数组+链表+红黑树,JDK1.8优化)
核心参数:默认容量16、负载因子0.75(容量达到75%扩容为2倍)
特点:key无序、key唯一、读写速度极快,线程不安全;key必须重写hashCode和equals才能正常去重
适用:绝大多数键值对存储场景
2. LinkedHashMap
继承HashMap,维护双向链表记录key插入顺序
特点:key有序、唯一;可实现LRU缓存(最近最少淘汰缓存)
3. TreeMap
底层红黑树,key自动排序;key必须具备比较规则(Comparable/Comparator)
适用:需要key按大小排序的场景
4. Hashtable
全方法加同步锁,线程安全,性能极低;key和value都不能存null,基本被ConcurrentHashMap替代
5. ConcurrentHashMap
HashMap线程安全版本,分段锁+CAS+synchronized实现高并发,多线程环境下首选Map
三、集合通用工具与迭代
1. Iterator迭代器:所有Collection通用遍历方式,遍历时不能用集合自身增删,否则触发并发修改异常 ConcurrentModificationException ,只能用迭代器自身remove
2. 增强for循环:底层就是迭代器,简化写法,只适合遍历,不能删除元素
3. Collections工具类:集合工具类(静态方法),提供排序、打乱、转线程安全集合、取最大最小值等方法,区别于Collection接口
4. 线程安全总结
- 不安全:ArrayList、LinkedList、HashSet、HashMap(单线程用)
- 安全:Vector、Hashtable(淘汰)、Collections.synchronizedList/Set/Map、ConcurrentHashMap(多线程首选)
四、集合选型总结(背诵版)
1. 存单列、要重复、有索引、查多增删少 → ArrayList
2. 存单列、要重复、频繁头尾增删 → LinkedList
3. 存单列、去重、不要求有序 → HashSet
4. 存单列、去重、要插入顺序 → LinkedHashSet
5. 存单列、去重、要自动排序 → TreeSet
6. 存键值对、key无序 → HashMap
7. 存键值对、key有序 → LinkedHashMap
8. 存键值对、key排序 → TreeMap
9. 多线程并发用集合 → CopyOnWriteArrayList、ConcurrentHashMap
浙公网安备 33010602011771号