1114 字
6 分钟
Java集合框架(JCF)

Java集合框架(Java Collections Framework,JCF)是Java标准库中用于存储、操作和管理一组对象的强大工具。它提供了一套统一的接口和实现类,用于处理各种数据结构,如列表、集合、队列、映射等。Java集合框架的设计目标是提高代码的可复用性、灵活性和性能。

核心组成部分#

接口(Interfaces)#

  • ​Collection: 是所有集合类的根接口,定义了集合的基本操作,如添加、删除、遍历等。
    • ​List: 有序集合,允许重复元素。常见实现类有 ArrayList、LinkedList。
    • ​Set: 无序集合,不允许重复元素。常见实现类有 HashSetTreeSet
    • ​Queue: 队列,遵循先进先出(FIFO)原则。常见实现类有 LinkedListPriorityQueue
  • ​Map: 存储键值对(Key-Value),键不允许重复。常见实现类有 HashMapTreeMap

实现类(Implementations)​#

  • ​List实现类:
    • ArrayList: 基于动态数组实现,查询快,增删慢。
    • LinkedList: 基于双向链表实现,增删快,查询慢。
  • ​Set实现类:
    • HashSet: 基于哈希表实现,无序,不允许重复。
    • TreeSet: 基于红黑树实现,有序,不允许重复。
  • ​Queue实现类:
    • PriorityQueue: 基于堆实现,优先级队列。
    • LinkedList: 可以作为队列或双端队列使用。
  • ​Map实现类:
    • HashMap: 基于哈希表实现,无序,允许空键和空值。
    • TreeMap: 基于红黑树实现,有序,键不允许为空。

工具类(Utility Classes)​#

  • Collections: 提供了一系列静态方法,用于操作集合,如排序、查找、反转等。
  • Arrays: 提供了一系列静态方法,用于操作数组。

Java集合框架的特点#

  • 统一性: 所有集合类都实现了统一的接口,使用方式一致。
  • 高性能: 不同的集合实现针对不同的场景进行了优化,如 ArrayList 适合查询,LinkedList 适合增删。
  • 可扩展性: 可以通过实现接口或继承抽象类来自定义集合类。
  • 线程安全: 部分集合类是线程安全的(如 VectorHashtable),但大多数集合类是非线程安全的,可以通过 Collections.synchronizedList() 等方法实现线程安全。

常用集合类的比较#

集合类底层实现特点适用场景
ArrayList动态数组查询快,增删慢需要频繁查询的场景
LinkedList双向链表增删快,查询慢需要频繁增删的场景
HashSet哈希表无序,不允许重复去重、快速查找
TreeSet红黑树有序,不允许重复需要排序的场景
HashMap哈希表无序,允许空键和空值快速查找键值对
TreeMap红黑树有序,键不允许为空需要排序键值对的场景
PriorityQueue优先级队列,元素按优先级排序任务调度、优先级处理

HashSet vs HashMap#

基本定义#

  • HashSet:
    • 是一个实现 Set 接口的集合类。
    • 存储唯一的元素,不允许重复。
    • 内部使用 HashMap 来存储元素(元素作为 HashMap 的键,值是一个固定的 PRESENT 对象)。
    • 无序,不保证元素的顺序。
  • HashMap:
    • 是一个实现 Map 接口的集合类。
    • 存储键值对(Key-Value),键不允许重复,值可以重复。
    • 基于哈希表实现,使用键的哈希值来快速查找和存储数据。
    • 无序,不保证键值对的顺序。

这两个东西都是非线程安全的

存储方式#

HashSet:

  • 只存储元素(对象),元素是唯一的。
  • 内部实现:HashSet 使用 HashMap 来存储元素,元素作为 HashMap 的键,值是一个固定的 PRESENT 对象(private static final Object PRESENT = new Object())。
// HashSet 内部实现
public class HashSet<E> 
    extends AbstractSet<E> 
    implements Set<E>, Cloneable, java.io.Serializable 
{
    private transient HashMap<E, Object> map;
    private static final Object PRESENT = new Object();

    public HashSet() {
        map = new HashMap<>();
    }

    public boolean add(E e) {
        return map.put(e, PRESENT) == null;
    }
}

HashMap:

  • 存储键值对(Key-Value),键是唯一的,值可以重复。
  • 内部实现:HashMap 使用数组和链表(或红黑树)来存储键值对,通过键的哈希值快速定位存储位置。
// HashMap 内部实现
public class HashMap<K, V> {
    transient Node<K, V>[] table;

    static class Node<K, V> {
        final int hash;
        final K key;
        V value;
        Node<K, V> next;
    }
}

Collection示例代码#

import java.util.*;

public class CollectionExample {
    public static void main(String[] args) {
        // List示例
        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");
        System.out.println("List: " + list);

        // Set示例
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // 重复元素不会被添加
        System.out.println("Set: " + set);

        // Map示例
        Map<String, Integer> map = new HashMap<>();
        map.put("Alice", 25);
        map.put("Bob", 30);
        System.out.println("Map: " + map);

        // Queue示例
        Queue<String> queue = new LinkedList<>();
        queue.offer("Task1");
        queue.offer("Task2");
        System.out.println("Queue: " + queue.poll()); // 先进先出
    }
}
Java集合框架(JCF)
https://fuwari.vercel.app/posts/jcf/
作者
Lettle
发布于
2025-03-02
许可协议
CC BY-NC-SA 4.0