Java集合框架

Java集合框架

概述

Java集合框架(Java Collections Framework)是Java中用于存储和操作对象集合的统一架构。它提供了一套设计良好的接口和实现类,用于处理不同类型的数据集合。

集合框架层次结构

Collection接口层次

Collection
├── List(有序,可重复)
│   ├── ArrayList
│   ├── LinkedList
│   └── Vector
├── Set(无序,不可重复)
│   ├── HashSet
│   ├── LinkedHashSet
│   └── TreeSet
└── Queue(队列)
    ├── PriorityQueue
    └── Deque
        └── ArrayDeque

Map接口层次

Map(键值对)
├── HashMap
├── LinkedHashMap
├── TreeMap
└── Hashtable

List接口及实现

ArrayList

  • 底层实现:动态数组
  • 特点
    • 随机访问速度快(O(1))
    • 插入和删除操作较慢(O(n))
    • 线程不安全
    • 默认初始容量为10
java
List<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.add("Python");
arrayList.get(0); // 快速随机访问
List<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.add("Python");
arrayList.get(0); // 快速随机访问

LinkedList

  • 底层实现:双向链表
  • 特点
    • 插入和删除操作快(O(1))
    • 随机访问较慢(O(n))
    • 线程不安全
    • 实现了List和Deque接口
java
List<String> linkedList = new LinkedList<>();
linkedList.add("Java");
linkedList.addFirst("Python"); // 头部插入
linkedList.addLast("C++");     // 尾部插入
List<String> linkedList = new LinkedList<>();
linkedList.add("Java");
linkedList.addFirst("Python"); // 头部插入
linkedList.addLast("C++");     // 尾部插入

Vector

  • 底层实现:动态数组
  • 特点
    • 线程安全(方法使用synchronized修饰)
    • 性能较ArrayList差
    • 扩容时容量翻倍

Set接口及实现

HashSet

  • 底层实现:HashMap
  • 特点
    • 无序,不可重复
    • 允许null值
    • 线程不安全
    • 查找速度快(O(1))
java
Set<String> hashSet = new HashSet<>();
hashSet.add("Java");
hashSet.add("Python");
hashSet.add("Java"); // 重复元素不会被添加
Set<String> hashSet = new HashSet<>();
hashSet.add("Java");
hashSet.add("Python");
hashSet.add("Java"); // 重复元素不会被添加

LinkedHashSet

  • 底层实现:HashMap + 双向链表
  • 特点
    • 保持插入顺序
    • 其他特性与HashSet相同

TreeSet

  • 底层实现:红黑树
  • 特点
    • 有序(自然排序或自定义排序)
    • 不允许null值
    • 查找、插入、删除时间复杂度为O(log n)
java
Set<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
// 输出:[1, 2, 3] 自动排序
Set<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
// 输出:[1, 2, 3] 自动排序

Map接口及实现

HashMap

  • 底层实现:数组 + 链表 + 红黑树(JDK 1.8+)
  • 特点
    • 键值对存储
    • 允许null键和null值
    • 线程不安全
    • 查找速度快(平均O(1))
java
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("Java", 25);
hashMap.put("Python", 30);
hashMap.get("Java"); // 返回25
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("Java", 25);
hashMap.put("Python", 30);
hashMap.get("Java"); // 返回25

LinkedHashMap

  • 底层实现:HashMap + 双向链表
  • 特点
    • 保持插入顺序或访问顺序
    • 可用于实现LRU缓存

TreeMap

  • 底层实现:红黑树
  • 特点
    • 按键排序
    • 不允许null键
    • 时间复杂度为O(log n)

Hashtable

  • 底层实现:数组 + 链表
  • 特点
    • 线程安全
    • 不允许null键和null值
    • 性能较HashMap差

集合工具类

Collections类

提供了许多静态方法来操作集合:

java
List<Integer> list = Arrays.asList(3, 1, 4, 1, 5);

// 排序
Collections.sort(list);

// 反转
Collections.reverse(list);

// 查找
int index = Collections.binarySearch(list, 4);

// 创建不可变集合
List<Integer> unmodifiableList = Collections.unmodifiableList(list);
List<Integer> list = Arrays.asList(3, 1, 4, 1, 5);

// 排序
Collections.sort(list);

// 反转
Collections.reverse(list);

// 查找
int index = Collections.binarySearch(list, 4);

// 创建不可变集合
List<Integer> unmodifiableList = Collections.unmodifiableList(list);

Arrays类

提供了数组操作的工具方法:

java
int[] array = {3, 1, 4, 1, 5};

// 排序
Arrays.sort(array);

// 转换为List
List<Integer> list = Arrays.asList(1, 2, 3);

// 填充
Arrays.fill(array, 0);
int[] array = {3, 1, 4, 1, 5};

// 排序
Arrays.sort(array);

// 转换为List
List<Integer> list = Arrays.asList(1, 2, 3);

// 填充
Arrays.fill(array, 0);

性能比较

操作ArrayListLinkedListHashMapTreeMap
随机访问O(1)O(n)O(1)O(log n)
插入/删除(头部)O(n)O(1)O(1)O(log n)
插入/删除(尾部)O(1)O(1)O(1)O(log n)
查找O(n)O(n)O(1)O(log n)

选择建议

  1. 需要快速随机访问:选择ArrayList
  2. 频繁插入删除:选择LinkedList
  3. 需要去重且不关心顺序:选择HashSet
  4. 需要排序:选择TreeSet或TreeMap
  5. 需要键值对存储:选择HashMap
  6. 线程安全要求:使用Collections.synchronizedXxx()或ConcurrentHashMap

总结

Java集合框架提供了丰富的数据结构实现,理解各种集合的特点和适用场景对于编写高效的Java程序至关重要。在实际开发中,应根据具体需求选择合适的集合类型。