掌握Collection、List、Set、Map接口体系与集合框架设计原理
Java集合框架(Java Collections Framework,JCF)是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表示单一元素的集合。
所有集合类的根接口,定义了集合的基本操作。
boolean add(E e)
boolean remove(Object o)
int size()
boolean isEmpty()
Iterator<E> iterator()
有序集合,允许重复元素,支持索引访问。
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没有定义额外方法
// 但对add()等方法有特殊约束
boolean add(E e) // 重复元素返回false
队列接口,通常按FIFO(先进先出)方式排序元素。
boolean offer(E e) // 入队
E poll() // 出队
E peek() // 查看队头
boolean add(E e) // 入队(抛异常)
E remove() // 出队(抛异常)
键值对映射,每个键最多映射一个值。
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()
有序Set,元素按自然顺序或Comparator排序。
E first()
E last()
SortedSet<E> headSet(E toElement)
SortedSet<E> tailSet(E fromElement)
Comparator<? super E> comparator()
实现类 | 底层结构 | 访问性能 | 插入/删除性能 | 线程安全 | 适用场景 |
---|---|---|---|---|---|
ArrayList | 动态数组 | O(1) | O(n) | 否 | 频繁随机访问 |
LinkedList | 双向链表 | O(n) | O(1) | 否 | 频繁插入删除 |
Vector | 动态数组 | O(1) | O(n) | 是 | 线程安全需求 |
实现类 | 底层结构 | 性能 | 排序 | null支持 | 适用场景 |
---|---|---|---|---|---|
HashSet | 哈希表 | O(1) | 无序 | 支持 | 快速查找 |
LinkedHashSet | 哈希表+链表 | O(1) | 插入顺序 | 支持 | 保持插入顺序 |
TreeSet | 红黑树 | O(log n) | 自然排序 | 不支持 | 需要排序 |
实现类 | 底层结构 | 性能 | 排序 | 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]
}
}
// 设置初始容量避免频繁扩容
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();
// 处理元素
}