第四章:集合框架
4.2 常见集合类(List, Set, Map)
Java集合框架提供了多种集合类,用于存储和操作数据。这些集合类主要分为三类:List、Set和Map。它们各自有不同的特点和适用场景。
1. List(列表)
List是一个有序的集合,允许重复元素,可以通过索引访问元素。常见的实现类包括:
1.1 ArrayList
- 特点:基于动态数组实现,支持快速随机访问(通过索引)。
- 适用场景:适用于频繁查询和遍历,但插入和删除操作效率较低(需要移动元素)。
- 示例代码:
List<String> list = new ArrayList<>(); list.add("Java"); list.add("Python"); list.add(1, "C++"); // 在指定位置插入元素 System.out.println(list.get(0)); // 输出:Java
1.2 LinkedList
- 特点:基于双向链表实现,插入和删除操作效率高,但随机访问效率较低。
- 适用场景:适用于频繁插入和删除的场景。
- 示例代码:
List<String> list = new LinkedList<>(); list.add("Java"); list.addFirst("Python"); // 在头部插入元素 list.removeLast(); // 删除尾部元素
1.3 Vector
- 特点:线程安全的动态数组,性能较低,通常不推荐使用。
- 替代方案:可以使用
Collections.synchronizedList包装ArrayList。
2. Set(集合)
Set是一个不允许重复元素的集合,通常用于去重或判断元素是否存在。常见的实现类包括:
2.1 HashSet
- 特点:基于哈希表实现,元素无序,插入和查询效率高(平均时间复杂度为O(1))。
- 适用场景:快速去重或判断元素是否存在。
- 示例代码:
Set<String> set = new HashSet<>(); set.add("Java"); set.add("Python"); set.add("Java"); // 重复元素不会被添加 System.out.println(set.contains("Python")); // 输出:true
2.2 LinkedHashSet
- 特点:在
HashSet的基础上维护了元素的插入顺序。 - 适用场景:需要去重且保留插入顺序的场景。
2.3 TreeSet
- 特点:基于红黑树实现,元素按自然顺序或自定义顺序排序。
- 适用场景:需要有序集合的场景。
- 示例代码:
Set<String> set = new TreeSet<>(); set.add("Java"); set.add("Python"); set.add("C++"); System.out.println(set); // 输出:[C++, Java, Python](按字母顺序排序)
3. Map(映射)
Map是一种键值对(Key-Value)集合,键不允许重复。常见的实现类包括:
3.1 HashMap
- 特点:基于哈希表实现,键无序,插入和查询效率高。
- 适用场景:快速通过键查找值。
- 示例代码:
Map<String, Integer> map = new HashMap<>(); map.put("Java", 1); map.put("Python", 2); System.out.println(map.get("Java")); // 输出:1
3.2 LinkedHashMap
- 特点:在
HashMap的基础上维护了键的插入顺序或访问顺序。 - 适用场景:需要保留键的插入顺序或实现LRU缓存。
3.3 TreeMap
- 特点:基于红黑树实现,键按自然顺序或自定义顺序排序。
- 适用场景:需要有序键值对的场景。
- 示例代码:
Map<String, Integer> map = new TreeMap<>(); map.put("Java", 1); map.put("Python", 2); map.put("C++", 3); System.out.println(map); // 输出:{C++=3, Java=1, Python=2}(按字母顺序排序)
总结
| 集合类型 | 特点 | 常见实现类 |
|---|---|---|
List | 有序、允许重复 | ArrayList, LinkedList, Vector |
Set | 无序、不允许重复 | HashSet, LinkedHashSet, TreeSet |
Map | 键值对、键不允许重复 | HashMap, LinkedHashMap, TreeMap |
选择合适的集合类可以显著提高程序的性能和可读性。
