2047 字
约 6 分钟
8
第48章 Java集合框架概述
无标签

第48章 Java集合框架概述

面包屑导航 章节头部 学习目标

学习目标

  • 理解Java集合框架的整体架构和设计原理
  • 掌握Collection接口体系的层次结构
  • 学习List、Set、Queue接口的特点和使用场景
  • 理解Map接口体系的设计和应用
  • 掌握集合框架中的核心接口和抽象类
  • 了解集合框架的性能特点和选择原则

集合框架概述

Java集合框架概述

Java集合框架(Java Collections Framework,JCF)是Java平台中用于存储和操作对象集合的统一架构。它提供了一套设计良好的接口和实现,用于表示和操作集合,使程序员能够高效地处理数据。

集合框架的核心优势统一的架构:提供一致的API来操作不同类型的集合高性能:针对不同场景优化的数据结构实现互操作性:不同集合类型之间可以相互转换可扩展性:可以轻松创建自定义集合实现

集合框架层次结构

集合框架层次结构

Java集合框架继承体系图


Iterable<E>
    ↓
Collection<E>
    ├── List<E>
    │   ├── ArrayList<E>
    │   ├── LinkedList<E>
    │   ├── Vector<E>
    │   └── Stack<E>
    ├── Set<E>
    │   ├── HashSet<E>
    │   ├── LinkedHashSet<E>
    │   └── SortedSet<E>
    │       └── TreeSet<E>
    └── Queue<E>
        ├── PriorityQueue<E>
        └── Deque<E>
            └── ArrayDeque<E>

Map<K,V> (独立体系)
    ├── HashMap<K,V>
    ├── LinkedHashMap<K,V>
    ├── Hashtable<K,V>
    └── SortedMap<K,V>
        └── TreeMap<K,V>

重要说明Map接口并不继承Collection接口,它是一个独立的接口体系。Map表示键值对的映射关系,而Collection表示单一元素的集合。

核心接口详解

核心接口详解

Collection接口

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

  • 添加和删除元素
  • 查询集合大小和状态
  • 迭代器支持
  • 批量操作方法
  • 转换为数组
boolean add(E e)
boolean remove(Object o)
int size()
boolean isEmpty()
Iterator<E> iterator()

List接口

有序集合,允许重复元素,支持索引访问。

  • 按索引访问元素
  • 允许重复元素
  • 保持插入顺序
  • 支持位置插入和删除
  • 提供ListIterator
E get(int index)
E set(int index, E element)
void add(int index, E element)
E remove(int index)
int indexOf(Object o)

Set接口

不允许重复元素的集合,基于数学集合概念。

  • 不允许重复元素
  • 最多包含一个null元素
  • 基于equals()方法判断重复
  • 支持集合运算
  • 无索引访问
// Set没有定义额外方法
// 但对add()等方法有特殊约束
boolean add(E e) // 重复元素返回false

Queue接口

队列接口,通常按FIFO(先进先出)方式排序元素。

  • FIFO排序(通常)
  • 队列头部操作
  • 提供两套方法(抛异常/返回特殊值)
  • 支持优先级队列
  • 双端队列扩展
boolean offer(E e) // 入队
E poll()           // 出队
E peek()           // 查看队头
boolean add(E e)   // 入队(抛异常)
E remove()         // 出队(抛异常)

Map接口

键值对映射,每个键最多映射一个值。

  • 键值对存储
  • 键不能重复
  • 值可以重复
  • 支持null键和值(取决于实现)
  • 提供三种视图
V put(K key, V value)
V get(Object key)
V remove(Object key)
Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()

SortedSet接口

有序Set,元素按自然顺序或Comparator排序。

  • 元素自动排序
  • 支持范围查询
  • 提供首尾元素访问
  • 子集视图
  • Comparator支持
E first()
E last()
SortedSet<E> headSet(E toElement)
SortedSet<E> tailSet(E fromElement)
Comparator<? super E> comparator()

集合实现类比较

主要实现类比较

List实现类比较

实现类 底层结构 访问性能 插入/删除性能 线程安全 适用场景
ArrayList 动态数组 O(1) O(n) 否 频繁随机访问
LinkedList 双向链表 O(n) O(1) 否 频繁插入删除
Vector 动态数组 O(1) O(n) 是 线程安全需求

Set实现类比较

实现类 底层结构 性能 排序 null支持 适用场景
HashSet 哈希表 O(1) 无序 支持 快速查找
LinkedHashSet 哈希表+链表 O(1) 插入顺序 支持 保持插入顺序
TreeSet 红黑树 O(log n) 自然排序 不支持 需要排序

Map实现类比较

实现类 底层结构 性能 排序 null支持 线程安全
HashMap 哈希表 O(1) 无序 键值都支持 否
LinkedHashMap 哈希表+链表 O(1) 插入/访问顺序 键值都支持 否
TreeMap 红黑树 O(log n) 键自然排序 值支持 否
Hashtable 哈希表 O(1) 无序 都不支持 是

集合框架使用示例

集合框架使用示例

import java.util.*;

public class CollectionsDemo {
    public static void main(String[] args) {
        // List示例 - 有序,允许重复
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // 允许重复
        System.out.println("List: " + list); // [Apple, Banana, Apple]
        
        // Set示例 - 无重复元素
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // 重复元素被忽略
        System.out.println("Set: " + set); // [Apple, Banana]
        
        // Map示例 - 键值对
        Map<String, Integer> map = new HashMap<>();
        map.put("Apple", 5);
        map.put("Banana", 3);
        map.put("Orange", 8);
        System.out.println("Map: " + map); // {Apple=5, Banana=3, Orange=8}
        
        // Queue示例 - 队列操作
        Queue<String> queue = new LinkedList<>();
        queue.offer("First");
        queue.offer("Second");
        queue.offer("Third");
        System.out.println("Queue poll: " + queue.poll()); // First
        System.out.println("Queue: " + queue); // [Second, Third]
    }
}

💻 查看完整代码 - 在线IDE体验 选择集合的原则

选择集合的原则

如何选择合适的集合类型

选择建议

  • 需要索引访问→ 选择List
  • 不允许重复→ 选择Set
  • 键值对存储→ 选择Map
  • FIFO操作→ 选择Queue
  • 频繁随机访问→ ArrayList
  • 频繁插入删除→ LinkedList
  • 需要排序→ TreeSet/TreeMap
  • 线程安全→ Vector/Hashtable

避免的误区

  • 不考虑性能特点盲目选择
  • 在单线程环境使用同步集合
  • 频繁插入删除时使用ArrayList
  • 需要排序时使用HashMap
  • 忽略集合的容量设置
  • 不合理的集合嵌套
  • 忘记重写equals和hashCode
  • 在循环中修改集合结构

性能考虑

性能考虑

性能优化建议初始容量:为ArrayList、HashMap等设置合适的初始容量负载因子:HashMap的负载因子影响性能和内存使用迭代器:使用迭代器而不是索引遍历LinkedList批量操作:使用addAll()等批量操作方法并发考虑:多线程环境下选择合适的并发集合

// 设置初始容量避免频繁扩容
List<String> list = new ArrayList<>(1000);
Map<String, String> map = new HashMap<>(16, 0.75f);

// 使用批量操作
List<String> source = Arrays.asList("a", "b", "c");
List<String> target = new ArrayList<>();
target.addAll(source); // 比逐个add效率高

// 正确的遍历方式
for (String item : list) {
    // 使用增强for循环
}

// 或使用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String item = it.next();
    // 处理元素
}

章节总结

章节总结

  • Java集合框架提供了统一的数据结构操作接口
  • Collection是单元素集合的根接口,Map是键值对集合的根接口
  • List支持索引访问和重复元素,Set不允许重复元素
  • Queue提供队列操作,Map提供键值对映射
  • 不同实现类有不同的性能特点和适用场景
  • 选择集合类型需要考虑数据特点和操作需求
  • 合理设置初始容量和负载因子可以提高性能
  • 理解集合框架的设计原理有助于正确使用

导航链接 上一章:try-with-resources 章节测试 下一章:List接口

第48章 Java集合框架概述
https://clxhxhhr.top/posts/2993/
作者
clxstart
发布于
2026-09-24
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。