Java集合框架详解:List、Set、Map及其实现类
一、集合框架概述
Java集合框架提供了一套统一的接口和类,用于存储和操作数据。核心接口包括:
- List:有序、可重复的集合。
- Set:无序、不可重复的集合。
- Map:键值对(Key-Value)映射。
二、List接口
List
是有序集合,允许重复元素,可以通过索引访问元素。
1. ArrayList
- 底层数据结构:动态数组。
- 特点:
- 支持快速随机访问(时间复杂度 O(1))。
- 插入和删除元素时可能需要移动数据(时间复杂度 O(n))。
- 示例:
java
复制
import java.util.ArrayList;public class ArrayListDemo {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add(1, "Orange"); // 在索引1处插入System.out.println(list.get(1)); // 输出:Orange(随机访问)list.remove(0); // 删除索引0的元素System.out.println(list); // 输出:[Orange, Banana]} }
2. LinkedList
- 底层数据结构:双向链表。
- 特点:
- 插入和删除元素高效(时间复杂度 O(1))。
- 随机访问效率低(需遍历链表,时间复杂度 O(n))。
- 示例:
java
复制
import java.util.LinkedList;public class LinkedListDemo {public static void main(String[] args) {LinkedList<String> list = new LinkedList<>();list.add("A");list.addFirst("Start"); // 头部插入list.addLast("End"); // 尾部插入System.out.println(list.getFirst()); // 输出:StartSystem.out.println(list.removeLast()); // 输出:End} }
3. List对比
特性 | ArrayList | LinkedList |
---|---|---|
底层结构 | 动态数组 | 双向链表 |
随机访问 | 高效(O(1)) | 低效(O(n)) |
插入/删除 | 需移动数据(O(n)) | 高效(O(1)) |
适用场景 | 频繁查询、尾部操作 | 频繁插入/删除 |
三、Set接口
Set
是无序集合,不允许重复元素。
1. HashSet
- 底层数据结构:哈希表(基于
HashMap
)。 - 特点:
- 元素无序。
- 允许存储
null
值。 - 插入、删除、查询时间复杂度 O(1)。
- 示例:
java
复制
import java.util.HashSet;public class HashSetDemo {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("Apple");set.add("Apple"); // 重复元素,不会被添加set.add("Banana");System.out.println(set.contains("Apple")); // 输出:trueSystem.out.println(set); // 输出:[Apple, Banana](顺序不确定)} }
2. TreeSet
- 底层数据结构:红黑树(基于
TreeMap
)。 - 特点:
- 元素按自然顺序或自定义
Comparator
排序。 - 插入、删除、查询时间复杂度 O(log n)。
- 元素按自然顺序或自定义
- 示例:
java
复制
import java.util.TreeSet;public class TreeSetDemo {public static void main(String[] args) {TreeSet<Integer> set = new TreeSet<>();set.add(3);set.add(1);set.add(2);System.out.println(set.first()); // 输出:1(按升序排列)System.out.println(set); // 输出:[1, 2, 3]} }
3. Set对比
特性 | HashSet | TreeSet |
---|---|---|
底层结构 | 哈希表 | 红黑树 |
元素顺序 | 无序 | 自然顺序或自定义排序 |
性能 | O(1) | O(log n) |
允许 null | 是 | 否(会抛异常) |
适用场景 | 快速去重、无序需求 | 需要排序的场景 |
四、Map接口
Map
存储键值对(Key-Value),键不可重复。
1. HashMap
- 底层数据结构:哈希表(数组 + 链表/红黑树)。
- 特点:
- 键值对无序。
- 插入、删除、查询时间复杂度 O(1)。
- 允许一个
null
键和多个null
值。
- 示例:
java
复制
import java.util.HashMap;public class HashMapDemo {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>();map.put("Alice", 90);map.put("Bob", 85);map.put("Alice", 95); // 覆盖原有值System.out.println(map.get("Alice")); // 输出:95System.out.println(map.containsKey("Bob")); // 输出:true} }
2. TreeMap
- 底层数据结构:红黑树(基于
NavigableMap
)。 - 特点:
- 键按自然顺序或自定义
Comparator
排序。 - 插入、删除、查询时间复杂度 O(log n)。
- 键按自然顺序或自定义
- 示例:
java
复制
import java.util.TreeMap;public class TreeMapDemo {public static void main(String[] args) {TreeMap<String, Integer> map = new TreeMap<>();map.put("Zebra", 1);map.put("Apple", 2);map.put("Cat", 3);System.out.println(map.firstKey()); // 输出:Apple(按升序排列)System.out.println(map); // 输出:{Apple=2, Cat=3, Zebra=1}} }
3. Map对比
特性 | HashMap | TreeMap |
---|---|---|
底层结构 | 哈希表 | 红黑树 |
键顺序 | 无序 | 自然顺序或自定义排序 |
性能 | O(1) | O(log n) |
允许 null 键 | 是 | 否 |
适用场景 | 快速查找、无序需求 | 需要排序的键值对 |
五、综合示例
java
复制
import java.util.*;public class CollectionDemo {public static void main(String[] args) {// List示例List<String> arrayList = new ArrayList<>();arrayList.add("A");arrayList.add("B");System.out.println("ArrayList: " + arrayList); // [A, B]// Set示例Set<Integer> hashSet = new HashSet<>();hashSet.add(3);hashSet.add(1);hashSet.add(2);System.out.println("HashSet: " + hashSet); // [1, 2, 3](顺序不确定)// Map示例Map<String, String> hashMap = new HashMap<>();hashMap.put("Key1", "Value1");hashMap.put("Key2", "Value2");System.out.println("HashMap: " + hashMap); // {Key1=Value1, Key2=Value2}} }
六、总结
集合类型 | 实现类 | 特点 | 适用场景 |
---|---|---|---|
List | ArrayList | 快速随机访问,尾部操作高效 | 频繁查询、按索引操作 |
LinkedList | 插入/删除高效,支持双向遍历 | 频繁插入/删除、链表操作 | |
Set | HashSet | 无序,快速查找 | 数据去重、无需顺序 |
TreeSet | 有序,支持范围查询 | 需要排序的去重场景 | |
Map | HashMap | 键值对无序,快速查找 | 键值映射、高频查询 |
TreeMap | 键有序,支持范围操作 | 需要排序的键值对 |
通过合理选择集合类,可以显著提升代码效率和可维护性!