(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)
目录
前言
一、Java集合框架概述
二、Collection接口及其实现
2.1 Collection接口
2.2 List接口及其实现
示例代码:
import java.util.ArrayList;
import java.util.List;
public class ListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println(list); // 输出:[Apple, Banana, Cherry]
// 访问元素
System.out.println(list.get(1)); // 输出:Banana
// 遍历列表
for (String fruit : list) {
System.out.println(fruit);
}
}
}
2.3 Set接口及其实现
示例代码:
import java.util.HashSet;
import java.util.Set;
public class SetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Apple"); // 重复添加,不会加入集合
System.out.println(set); // 输出可能:[Banana, Apple] 或其他顺序,因为HashSet无序
// 遍历集合
for (String fruit : set) {
System.out.println(fruit);
}
}
}
三、Map接口及其实现
3.1 Map的基本操作
示例代码:
import java.util.HashMap;
import java.util.Map;
public class MapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 100);
map.put("Banana", 200);
map.put("Cherry", 300);
// 访问元素
System.out.println(map.get("Banana")); // 输出:200
// 检查键是否存在
if (map.containsKey("Grape")) {
System.out.println("Found Grape");
} else {
System.out.println("Grape not found");
}
// 遍历Map
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
// 使用keySet和values遍历
for (String key : map.keySet()) {
System.out.println("Key = " + key);
}
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
}
}
四、集合的遍历与迭代
4.1 使用for-each
循环遍历
4.2 使用迭代器遍历
示例代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
// 可以在遍历过程中删除元素,但不能用集合的remove方法
// 如果需要删除元素,可以使用迭代器的remove方法
// if ("Banana".equals(fruit)) {
// iterator.remove(); // 正确的方式
// }
}
// 注意:如果尝试在遍历过程中直接修改集合(如使用list.remove()),
// 则可能会抛出ConcurrentModificationException异常。
}
}
4.3 使用分割器遍历(Java 8+)
五、Spliterator的高级应用
5.1 Spliterator简介
5.2 Spliterator的特性
5.3 使用Spliterator
示例代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Spliterator;
import java.util.function.Consumer;
public class SpliteratorExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
numbers.add(i);
}
Spliterator<Integer> spliterator = numbers.spliterator();
// 自定义遍历逻辑
processSpliterator(spliterator, System.out::println);
// 假设我们想并行处理,可以手动分割Spliterator
// 注意:这里只是示例,实际并行处理应使用Parallel Streams或ForkJoinPool
Spliterator<Integer> left = null, right = null;
if (spliterator.trySplit()) {
left = spliterator; // 分割后的第一个Spliterator
right = numbers.spliterator(); // 注意:这里应该是spliterator.trySplit()的返回值,但此处仅为示例
}
// 假设我们有两个线程来并行处理
// new Thread(() -> processSpliterator(left, x -> { /* 处理逻辑 */ })).start();
// new Thread(() -> processSpliterator(right, x -> { /* 处理逻辑 */ })).start();
}
private static void processSpliterator(Spliterator<Integer> spliterator, Consumer<Integer> action) {
spliterator.forEachRemaining(action);
}
// 注意:上面的代码片段中,尝试手动分割spliterator并分配给两个线程是不正确的,
// 因为right = numbers.spliterator(); 实际上又创建了一个新的spliterator,
// 而不是从原始spliterator中分割出来的。
// 正确的做法是使用spliterator.trySplit()的返回值。
}
// 正确的并行处理示例(使用Parallel Streams)
public static void processParallel(List<Integer> numbers) {
numbers.parallelStream().forEach(System.out::println);
// 注意:由于println不是线程安全的,上面的代码在并行流中可能会导致输出混乱。
// 在实际应用中,应该使用线程安全的操作或收集器。
}