1114 字
6 分钟
Java集合框架(JCF)
Java集合框架(Java Collections Framework,JCF)
是Java标准库中用于存储、操作和管理一组对象的强大工具。它提供了一套统一的接口和实现类,用于处理各种数据结构,如列表、集合、队列、映射等。Java集合框架的设计目标是提高代码的可复用性、灵活性和性能。
核心组成部分
接口(Interfaces)
- Collection: 是所有集合类的根接口,定义了集合的基本操作,如添加、删除、遍历等。
- List: 有序集合,允许重复元素。常见实现类有 ArrayList、LinkedList。
- Set: 无序集合,不允许重复元素。常见实现类有
HashSet
、TreeSet
。 - Queue: 队列,遵循先进先出(FIFO)原则。常见实现类有
LinkedList
、PriorityQueue
。
- Map: 存储键值对(Key-Value),键不允许重复。常见实现类有
HashMap
、TreeMap
。
实现类(Implementations)
- List实现类:
ArrayList
: 基于动态数组实现,查询快,增删慢。LinkedList
: 基于双向链表实现,增删快,查询慢。
- Set实现类:
HashSet
: 基于哈希表实现,无序,不允许重复。TreeSet
: 基于红黑树实现,有序,不允许重复。
- Queue实现类:
PriorityQueue
: 基于堆实现,优先级队列。LinkedList
: 可以作为队列或双端队列使用。
- Map实现类:
HashMap
: 基于哈希表实现,无序,允许空键和空值。TreeMap
: 基于红黑树实现,有序,键不允许为空。
工具类(Utility Classes)
- Collections: 提供了一系列静态方法,用于操作集合,如排序、查找、反转等。
- Arrays: 提供了一系列静态方法,用于操作数组。
Java集合框架的特点
- 统一性: 所有集合类都实现了统一的接口,使用方式一致。
- 高性能: 不同的集合实现针对不同的场景进行了优化,如
ArrayList
适合查询,LinkedList
适合增删。 - 可扩展性: 可以通过实现接口或继承抽象类来自定义集合类。
- 线程安全: 部分集合类是线程安全的(如
Vector
、Hashtable
),但大多数集合类是非线程安全的,可以通过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()); // 先进先出
}
}