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

相关推荐
Blossom.1181 小时前
把 AI 塞进「自行车码表」——基于 MEMS 的 3D 地形预测码表
人工智能·python·深度学习·opencv·机器学习·计算机视觉·3d
祈祷苍天赐我java之术5 小时前
Linux 进阶之性能调优,文件管理,网络安全
java·linux·运维
无处不在的海贼5 小时前
小明的Java面试奇遇之发票系统相关深度实战挑战
java·经验分享·面试
武子康5 小时前
Java-109 深入浅出 MySQL MHA主从故障切换机制详解 高可用终极方案
java·数据库·后端·mysql·性能优化·架构·系统架构
蒋星熠5 小时前
区块链技术探索与应用:从密码学奇迹到产业变革引擎
python·语言模型·web3·去中心化·区块链·密码学·智能合约
秋难降5 小时前
代码界的 “建筑师”:建造者模式,让复杂对象构建井然有序
java·后端·设计模式
bdgtd881786 小时前
动态修补C扩展模块的函数指针有哪些风险?安全的修补方案是什么?
c语言·开发语言·安全
深耕云原生6 小时前
Kubernetes 深入浅出系列 | 容器剖析之容器安全
安全·容器·kubernetes
bkspiderx6 小时前
安全扫描:目标主机支持RSA密钥交换问题
网络·nginx·安全·tls·rsa·弱算法
FreeBuf_6 小时前
Chrome高危零日漏洞PoC公开,已被用于野外攻击
linux·运维·服务器·安全·web安全