Java 集合框架是 Java 编程中处理数据结构的核心工具,提供了丰富的接口和类来存储、操作和管理数据。以下是 Java 集合操作的详细解析,涵盖常用类、核心操作及示例代码。
一、Java 集合框架的核心接口与类
1. 接口分类
-
Collection
接口:所有集合的根接口。-
List
:有序且允许重复(如ArrayList
,LinkedList
)。 -
Set
:无序且不允许重复(如HashSet
,TreeSet
)。 -
Queue
:队列结构(如LinkedList
,PriorityQueue
)。
-
-
Map
接口:键值对存储(如HashMap
,TreeMap
)。
2. 常用实现类
接口 | 实现类 | 特点 |
---|---|---|
List | ArrayList | 基于动态数组,随机访问快,增删慢(需移动元素) |
LinkedList | 基于双向链表,增删快,随机访问慢 | |
Set | HashSet | 基于哈希表,无序,允许 null |
TreeSet | 基于红黑树,有序(自然排序或自定义 Comparator ) | |
Queue | PriorityQueue | 基于堆,元素按优先级排序 |
Map | HashMap | 基于哈希表,键无序,允许 null 键和值 |
LinkedHashMap | 保持插入顺序或访问顺序 | |
TreeMap | 基于红黑树,键有序 |
二、集合的创建与初始化
1. List 示例
java
List<String> list1 = new ArrayList<>(); // 空列表 List<Integer> list2 = Arrays.asList(1, 2, 3); // 固定大小列表(不可添加元素) List<String> list3 = new ArrayList<>(Arrays.asList("A", "B", "C")); // 可修改的列表
2. Set 示例
java
Set<String> set1 = new HashSet<>(); Set<Integer> set2 = new TreeSet<>(Arrays.asList(3, 1, 2)); // 自动排序
3. Map 示例
java
Map<String, Integer> map1 = new HashMap<>(); Map<Integer, String> map2 = new LinkedHashMap<>(); // 保持插入顺序
三、常见集合操作
1. 添加元素
java
List<String> list = new ArrayList<>(); list.add("Java"); list.add(0, "Python"); // 在索引0处插入 Set<Integer> set = new HashSet<>(); set.add(10); set.addAll(Arrays.asList(20, 30)); Map<String, Integer> map = new HashMap<>(); map.put("A", 1); map.putIfAbsent("B", 2); // 仅当键不存在时插入
2. 删除元素
java
list.remove("Java"); // 按对象删除 list.remove(0); // 按索引删除 set.remove(10); set.removeAll(Arrays.asList(20, 30)); map.remove("A"); map.remove("B", 2); // 仅当键值匹配时删除
3. 遍历集合
-
List/Set 遍历:
java
// 增强 for 循环 for (String s : list) { System.out.println(s); } // 迭代器 Iterator<String> it = list.iterator(); while (it.hasNext()) { System.out.println(it.next()); } // Java 8 forEach list.forEach(System.out::println);
-
Map 遍历:
java
// 遍历键值对 for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } // 遍历键或值 map.keySet().forEach(System.out::println); map.values().forEach(System.out::println);
四、集合排序与查找
1. 排序
java
List<Integer> numbers = new ArrayList<>(Arrays.asList(3, 1, 4)); // 自然排序 Collections.sort(numbers); // 自定义排序(降序) Collections.sort(numbers, (a, b) -> b - a); // Java 8 Stream 排序 List<Integer> sortedList = numbers.stream() .sorted(Comparator.reverseOrder()) .collect(Collectors.toList());
2. 查找
java
int index = Collections.binarySearch(numbers, 4); // 二分查找(需先排序) boolean exists = list.contains("Java");
五、线程安全集合
Java 默认集合类是非线程安全的。若需线程安全,可使用以下方法:
-
同步包装类:
java
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
-
并发集合类(推荐):
java
Map<String, Integer> concurrentMap = new ConcurrentHashMap<>(); Queue<Integer> blockingQueue = new LinkedBlockingQueue<>();
六、Java 8 Stream API 操作集合
java
List<String> filteredList = list.stream() .filter(s -> s.startsWith("J")) .collect(Collectors.toList()); Map<String, Integer> mapFromList = list.stream() .collect(Collectors.toMap(s -> s, String::length)); int sum = list.stream() .mapToInt(String::length) .sum();
七、注意事项
-
ConcurrentModificationException
:-
遍历集合时修改元素可能抛出此异常。解决方式:
-
使用迭代器的
remove()
方法。 -
使用并发集合类。
-
-
-
正确实现
equals()
和hashCode()
:-
在自定义对象作为
Set
元素或Map
键时需重写这两个方法。
-
-
选择合适的集合类型:
-
高频查询用
ArrayList
,频繁增删用LinkedList
。 -
需要唯一性用
Set
,需要键值对用Map
。
-
通过掌握这些操作和原理,可以高效地利用 Java 集合框架解决实际问题。