Java集合框架详解:核心类、使用场景与最佳实践

发布于:2025-04-16 ⋅ 阅读:(30) ⋅ 点赞:(0)

一、Java集合框架概览

Java集合框架(Java Collections Framework, JCF)是Java中用于存储和操作数据集合的核心工具,主要分为两大接口:

  • Collection:存储单一元素(List、Set、Queue)
  • Map:存储键值对(HashMap、TreeMap)

二、核心集合类详解

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

ArrayList
  • 初始化
    List<String> list = new ArrayList<>();          // 默认容量10
    List<String> list2 = new ArrayList<>(20);       // 指定初始容量
    
  • 排序
    Collections.sort(list);                        // 自然排序(元素需实现Comparable)
    Collections.sort(list, (a, b) -> b.compareTo(a)); // 自定义排序
    
  • 长度list.size()
  • 判空list.isEmpty()
  • 使用场景:频繁随机访问(get/set),数据量较小。
  • 注意事项
    • 线程不安全,多线程环境需同步。
    • 扩容机制(默认扩容1.5倍),频繁插入需预分配容量。
LinkedList
  • 初始化
    LinkedList<String> linkedList = new LinkedList<>();
    
  • 使用场景:频繁在头尾插入/删除(如实现栈、队列)。
  • 注意事项:随机访问效率低(时间复杂度O(n))。
List对比表
特性 ArrayList LinkedList
底层结构 动态数组 双向链表
随机访问速度 O(1) O(n)
头部插入/删除速度 O(n) O(1)
内存占用 较低(无指针) 较高(存储指针)

2. Set接口(无序、唯一)

HashSet
  • 初始化
    Set<String> set = new HashSet<>(20, 0.9f); // 指定容量和负载因子
    
  • 判空set.isEmpty()
  • 使用场景:快速去重、判断元素存在性。
  • 注意事项:元素需正确实现hashCode()equals()
TreeSet
  • 初始化
    Set<Integer> treeSet = new TreeSet<>(Comparator.reverseOrder()); // 逆序
    
  • 使用场景:需要有序且唯一的元素集合。
  • 注意事项:插入/删除时间复杂度O(log n)。
Set对比表
特性 HashSet TreeSet
底层结构 哈希表 红黑树
元素顺序 无序 自然/自定义排序
时间复杂度(增删查) O(1) 平均 O(log n)

3. Queue接口(队列)

PriorityQueue
  • 初始化
    Queue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder()); // 大顶堆
    
  • 使用场景:任务调度(按优先级处理)、Top K问题。
  • 注意事项:线程不安全,队首元素为最小值(默认自然排序)。

4. Map接口(键值对)

HashMap
  • 初始化
    Map<String, Integer> map = new HashMap<>(20, 0.8f); // 指定容量和负载因子
    
  • 排序
    // 按键排序
    TreeMap<String, Integer> sortedMap = new TreeMap<>(map);
    
  • 使用场景:快速键值存取、缓存实现。
  • 注意事项:键对象需正确实现hashCode()equals()
LinkedHashMap
  • 使用场景:保留插入顺序或实现LRU缓存。
    Map<String, Integer> lruCache = new LinkedHashMap<>(16, 0.75f, true) {
        @Override
        protected boolean removeEldestEntry(Map.Entry eldest) {
            return size() > 100; // 保留最近100个访问
        }
    };
    
Map对比表
特性 HashMap TreeMap LinkedHashMap
底层结构 哈希表 红黑树 哈希表+链表
顺序 无序 按键排序 插入/访问顺序
时间复杂度(增删查) O(1) 平均 O(log n) O(1) 平均

三、工具类与线程安全

1. Collections工具类

  • 排序与安全
    Collections.sort(list);                          // 排序
    List<String> syncList = Collections.synchronizedList(list); // 线程安全包装
    

2. 线程安全集合

场景 非线程安全类 线程安全替代方案
高并发List ArrayList CopyOnWriteArrayList
高并发Map HashMap ConcurrentHashMap
高并发Queue PriorityQueue PriorityBlockingQueue

四、最佳实践与使用场景

1. 常见场景推荐

需求 推荐集合 理由
快速查询元素 ArrayList / HashMap 随机访问时间复杂度O(1)
频繁插入删除(头尾) LinkedList 链表操作时间复杂度O(1)
数据去重 HashSet 哈希表去重效率高
需要自然排序 TreeSet / TreeMap 红黑树自动维护有序性
实现LRU缓存 LinkedHashMap 通过accessOrderremoveEldestEntry
高并发环境 ConcurrentHashMap 分段锁保证线程安全

2. 注意事项总结

  • 线程安全:默认集合类非线程安全,多线程环境需显式同步。
  • 初始容量:预估数据量,避免频繁扩容(如ArrayList默认扩容1.5倍)。
  • 对象一致性HashSet/HashMap的键对象不可变,避免哈希值变化。
  • 迭代器安全:遍历时修改集合可能引发ConcurrentModificationException

五、Java 8+ 增强

Stream API操作集合

List<String> filteredList = list.stream()
    .filter(s -> s.startsWith("A"))
    .map(String::toUpperCase)
    .collect(Collectors.toList());

六、总结

Java集合框架提供了丰富的工具类,开发者应根据具体需求选择合适的集合类型:

  • 查询多ArrayList / HashMap
  • 增删多LinkedList / LinkedHashMap
  • 排序需求TreeSet / TreeMap
  • 线程安全ConcurrentHashMap / CopyOnWriteArrayList

正确使用集合框架能显著提升代码性能和可维护性。建议结合场景需求,合理选择初始容量、排序方式及线程安全策略。


网站公告

今日签到

点亮在社区的每一天
去签到