【JAVA安全】Java 集合体系详解

Java 集合体系详解

Java 集合框架(Java Collections Framework)是Java中用于存储和操作数据集合的一组接口和类。它提供了一套标准化的方法来处理对象集合,使得开发者可以专注于业务逻辑而不是数据结构的实现。

一、集合框架概述

Java集合框架主要由以下几个部分组成:

  1. 接口(Interfaces): 定义集合的基本操作
  2. 实现类(Implementations): 接口的具体实现
  3. 算法(Algorithms): 提供搜索、排序等通用操作

二、核心接口层次结构

复制代码
Iterable (接口)
└── Collection (接口)
    ├── List (接口)
    ├── Set (接口)
    │    └── SortedSet (接口)
     └── Queue (接口)
         └── Deque (接口)
 
Map (接口)
└── SortedMap (接口)

三、主要集合接口详解

  1. Collection 接口

所有集合类的根接口,定义了集合的基本操作:

java 复制代码
public interface Collection<E> extends Iterable<E> {
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator<E> iterator();
    Object[] toArray();
    <T> T[] toArray(T[] a);
    boolean add(E e);
    boolean remove(Object o);
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c);
    boolean removeAll(Collection<?> c);
    boolean retainAll(Collection<?> c);
    void clear();
    // Java 8 新增的默认方法 
    default boolean removeIf(Predicate<? super E> filter) { ... }
    default Spliterator<E> spliterator() { ... }
    default Stream<E> stream() { ... }
    default Stream<E> parallelStream() { ... }
}
  1. List 接口

有序集合(序列),允许重复元素:

  • 精确控制每个元素的插入位置
  • 可以通过索引访问元素
  • 可以搜索元素

主要实现类:

  • ArrayList: 基于动态数组
  • LinkedList: 基于双向链表
  • Vector: 线程安全的动态数组(已过时)
  • Stack: 后进先出(LIFO)堆栈(继承自Vector)
  1. Set 接口

不允许重复元素的集合:

  • 不保证顺序(除非是SortedSet)
  • 最多包含一个null元素

主要实现类:

  • HashSet: 基于哈希表
  • LinkedHashSet: 保持插入顺序的HashSet
  • TreeSet: 基于红黑树的SortedSet实现
  1. Queue 接口

用于在处理前保存元素的集合:

  • 通常但不一定按FIFO(先进先出)原则排序
  • 优先级队列按提供的比较器或元素的自然顺序排序

主要实现类:

  • PriorityQueue: 优先级队列
  • ArrayDeque: 基于数组的双端队列
  • LinkedList: 也实现了Deque接口
  1. Map 接口

键值对映射,不继承Collection接口:

  • 键唯一,值可以重复
  • 每个键最多映射到一个值

主要实现类:

  • HashMap: 基于哈希表
  • LinkedHashMap: 保持插入顺序的HashMap
  • TreeMap: 基于红黑树的SortedMap实现
  • Hashtable: 线程安全的Map实现(已过时)
  • ConcurrentHashMap: 线程安全的HashMap替代

四、主要集合实现类比较

  1. List实现类比较
特性 ArrayList LinkedList Vector
底层结构 动态数组 双向链表 动态数组
线程安全 不安全 不安全 安全
随机访问 O(1) O(n) O(1)
插入/删除(首尾) O(n) O(1) O(n)
内存占用 较小 较大 较大
  1. Set实现类比较
特性 HashSet LinkedHashSet TreeSet
底层结构 哈希表 哈希表+链表 红黑树
排序 插入顺序 自然/比较器顺序
操作时间复杂度 O(1) O(1) O(log n)
允许null
  1. Map实现类比较
特性 HashMap LinkedHashMap TreeMap Hashtable
底层结构 哈希表 哈希表+链表 红黑树 哈希表
排序 插入/访问顺序 键排序
线程安全 不安全 不安全 不安全 安全
允许null键/值 是/是 是/是 否/是 否/否
性能 较高 中等

五、并发集合

Java还提供了一组线程安全的集合类:

  • CopyOnWriteArrayList: 线程安全的List实现
  • CopyOnWriteArraySet: 线程安全的Set实现
  • ConcurrentHashMap: 线程安全的HashMap实现
  • ConcurrentSkipListMap: 线程安全的SortedMap实现
  • ConcurrentSkipListSet: 线程安全的SortedSet实现
  • BlockingQueue接口及其实现类(如ArrayBlockingQueueLinkedBlockingQueue等)

六、集合工具类:Collections

java.util.Collections类提供了许多静态方法,用于操作或返回集合:

  • 排序:sort(), shuffle()
  • 搜索:binarySearch()
  • 同步包装:synchronizedCollection(), synchronizedList()
  • 不可修改包装:unmodifiableCollection(), unmodifiableList()
  • 单元素集合:singleton(), singletonList(), singletonMap()
  • 空集合:emptyList(), emptySet(), emptyMap()

七、Java 8+ 对集合的增强

  1. Stream API: 提供函数式操作集合的能力

    java 复制代码
    list.stream().filter(x -> x > 5).map(String::valueOf).collect(Collectors.toList());
  2. 默认方法: 在接口中添加新方法而不破坏现有实现

    java 复制代码
    default void forEach(Consumer<? super T> action)
    default boolean removeIf(Predicate<? super E> filter)
  3. 新的集合工厂方法 (Java 9+)

    java 复制代码
    List<String> list = List.of("a", "b", "c");
    Set<String> set = Set.of("a", "b", "c");
    Map<String, Integer> map = Map.of("a", 1, "b", 2);

八、最佳实践

  1. 根据需求选择合适的集合类型:

    • 需要键值对 → Map
    • 允许重复且有序 → List
    • 不允许重复 → Set
    • 需要排序 → TreeSet/TreeMap
    • 需要保持插入顺序 → LinkedHashSet/LinkedHashMap
  2. 预估集合大小时,初始化时指定容量以避免频繁扩容

  3. 在多线程环境下使用并发集合或同步包装

  4. 优先使用接口类型声明集合变量:

    java 复制代码
    List<String> list = new ArrayList<>();  // 好
    ArrayList<String> list = new ArrayList<>();  // 不好 
  5. 使用泛型确保类型安全

  6. 遍历集合时,考虑使用迭代器或for-each循环

Java集合框架强大而灵活,理解其设计原理和各个实现类的特点,能够帮助开发者编写出更高效、更健壮的代码。

相关推荐
iknow18112 分钟前
【Web安全】csrf、ssrf和xxe的区别
安全·web安全
雨绸缪26 分钟前
为什么 Java 在 2025 年仍然值得学习:开发人员的 25 年历程
java·后端·掘金·金石计划
站大爷IP43 分钟前
Django缓存机制详解:从配置到实战应用
python
叫我:松哥1 小时前
基于Python的实习僧招聘数据采集与可视化分析,使用matplotlib进行可视化
开发语言·数据库·python·课程设计·matplotlib·文本挖掘
站大爷IP1 小时前
Django模型开发全解析:字段、元数据与继承的实战指南
python
赵英英俊1 小时前
Python day37
人工智能·python·深度学习
花花无缺1 小时前
泛型类和泛型方法
java·后端
泉城老铁1 小时前
Spring Boot 中实现 COM 口数据监听并解析十六进制数据,结合多线程处理
java·后端·物联网
熊猫片沃子2 小时前
浅谈SpringBoot框架的优势
java·spring boot·后端
33255_40857_280592 小时前
RocketMQ高级特性实战:Java开发者的进阶指南
java·rocketmq