微信聊天记录不小心删了?备份、迁移、修复方法一次讲清楚
2026/5/26 13:33:02
Collection 是 Java 集合框架中单列集合的顶级接口,隶属于java.util包,与 Map 接口并列,定义了所有单列集合的通用行为,其核心子接口包括 List(有序可重复)、Set(无序不可重复)、Queue(队列)。进阶层面的 Collection 学习,需深入其设计思想、底层原理、性能优化及并发场景适配,而非仅停留在 API 使用层面。
Collection 框架采用 “接口 - 抽象类 - 实现类” 的分层设计,降低耦合性:
Collection 依赖 Iterator 接口实现统一遍历,核心优势是解耦遍历逻辑与集合底层结构:
hasNext()(判断是否有下一个元素)、next()(获取下一个元素)、remove()(删除当前元素,需在 next () 后调用);ConcurrentModificationException(通过 modCount 与 expectedModCount 对比实现);JDK 5 引入泛型后,Collection 支持类型限定,避免运行时类型转换异常:
List<String> list = new ArrayList<>()限定仅存储 String,编译时拒绝其他类型;? extends T(上界通配符,只读)、? super T(下界通配符,只写),用于灵活适配多态场景。Object[] elementData数组,默认初始容量 10(JDK 8 延迟初始化,首次 add 时才分配容量);size == elementData.length,扩容后容量为原容量的 1.5 倍(newCapacity = oldCapacity + (oldCapacity >> 1)),扩容时需复制数组(Arrays.copyOf),性能损耗较大;trimToSize()方法,释放未使用的数组空间(将 elementData 容量缩为 size)。addAll(int index, Collection<? extends E> c)减少扩容次数;ListIterator(支持正向 / 反向遍历,可添加 / 修改元素)。prev(前驱)、next(后继)、item(元素),无数组扩容问题;addAll(int index, Collection<? extends E> c)只需修改链表指针,无需移动大量元素,性能优于 ArrayList;PRESENT(Object 常量);hashCode()和equals()方法,与 HashMap 键的判定规则一致;addAll(Collection<? extends E> c)底层调用 HashMap 的 putAll,性能优于逐个 add;add()方法返回 false,不会抛出异常。compare(a,b) == 0则视为重复),无需依赖hashCode()和equals()(但仍建议重写,保证与比较器逻辑一致);ceiling(E e)(返回大于等于 e 的最小元素)、floor(E e)(返回小于等于 e 的最大元素)、subSet(E from, E to)(获取子集)。addIfAbsent()保证元素唯一性;Collections.synchronizedSet(new HashSet<>()))。offer(E e)(插入元素,调整堆结构)、poll()(删除堆顶元素,调整堆结构),时间复杂度 O (logn);put()阻塞直到队列有空位;offer(E e, long timeout, TimeUnit unit)超时阻塞;take()阻塞直到队列有元素;poll(long timeout, TimeUnit unit)超时阻塞;| 场景 | 推荐实现类 | 避免使用 | 原因 |
|---|---|---|---|
| 随机访问、读多写少 | ArrayList | LinkedList | ArrayList 索引访问 O (1),LinkedList O (n) |
| 频繁插入 / 删除(中间位置) | LinkedList | ArrayList | ArrayList 需移动元素,LinkedList 仅修改指针 |
| 并发读多写少 | CopyOnWriteArrayList/CopyOnWriteArraySet | Collections.synchronizedList() | 无锁读,性能更优 |
| 并发队列操作 | ArrayBlockingQueue/LinkedBlockingQueue | 手动同步的 Queue | 内置阻塞机制,无需额外加锁 |
| 去重 + 有序 | LinkedHashSet | HashSet + 手动排序 | 直接维护插入顺序,无需额外处理 |
new ArrayList<>(1000)),避免多次扩容(扩容需复制数组,损耗性能);new HashSet<>(200)(底层 HashMap 初始容量 200,减少扩容次数)。| 遍历方式 | 适用场景 | 性能排序(从优到差) |
|---|---|---|
| 迭代器(Iterator) | 所有 Collection | 最优(直接操作底层结构,无额外计算) |
| 增强 for 循环(for-each) | 只读遍历 | 次优(底层编译为 Iterator) |
| 普通 for 循环(索引) | ArrayList(随机访问) | 中等(仅适用于 List) |
| 普通 for 循环(索引) | LinkedList(链表) | 最差(每次 get 遍历链表) |
addAll()/removeAll()/retainAll()等批量方法,减少循环调用单个方法的开销;addAll()只需 1 次扩容检查,逐个add()可能触发多次扩容。ArrayList、LinkedList、HashSet、TreeSet、ArrayDeque 等,多线程下修改会导致:
List<String> syncList = Collections.synchronizedList(new ArrayList<>());| 并发集合 | 适用场景 | 核心优势 |
|---|---|---|
| CopyOnWriteArrayList | 读多写少 | 读无锁,写复制数组,性能优于同步包装器 |
| CopyOnWriteArraySet | 读多写少、去重 | 基于 CopyOnWriteArrayList 实现 |
| ConcurrentLinkedQueue | 高并发、无界队列 | 无锁(CAS)实现,性能最优 |
| ArrayBlockingQueue | 有界阻塞队列 | 公平 / 非公平锁,适用于生产消费模型 |
| LinkedBlockingQueue | 无界 / 有界阻塞队列 | 分离锁(入队 / 出队不同锁),并发性能更高 |
Collection 作为 Java 单列集合的核心,其进阶学习的关键在于:
Lock lock = new ReentrantLock(); List<String> list = new ArrayList<>(); public void add(String s) { lock.lock(); try { list.add(s); } finally { lock.unlock(); } }