🌟 Java 集合框架大师课:遍历宇宙的降龙十八掌(二)
🚀 系列进度:集合框架战力值+70% | 建议边喝肥宅快乐水边敲代码 🥤
第一章:遍历奥义总决式
1.1 遍历的本质是什么?
集合遍历就像快递小哥送包裹📦,必须确保:
- 每个元素都能被访问到 ✅
- 不重复派送(除非集合允许) 🔄
- 处理过程中不丢件/损坏 🚚
第二章:List 家族秘技
2.1 ArrayList 的三种武艺
// 经典下标流
List<String> anime = Arrays.asList("鬼灭", "咒术", "间谍");
for(int i=0; i<anime.size(); i++){
System.out.println("🎌 第" + (i+1) + "集:" + anime.get(i));
}
// 迭代器流
Iterator<String> it = anime.iterator();
while(it.hasNext()){
String current = it.next();
if(current.contains("咒")) it.remove(); // 安全删除
}
// 现代 Lambda 流
anime.forEach(x -> System.out.println("🔥 " + x));
2.2 LinkedList 特训场
graph LR
A[头节点] --> B[元素A]
B --> C[元素B]
C --> D[元素C]
D --> E[尾节点]
style B fill:#f9d,stroke:#333
style D fill:#9df,stroke:#333
// 双向链表专用 ListIterator
ListIterator<String> li = anime.listIterator(anime.size());
while(li.hasPrevious()){
System.out.println("倒放模式 ▶◀ " + li.previous());
}
第三章:Set 门派的唯一之道
3.1 HashSet 的随机之旅
Set<Integer> lottery = new HashSet<>(Arrays.asList(7,15,23,4));
System.out.println("🎱 本期彩票号码:");
// 增强型 for 循环(不能保证顺序!)
for(int num : lottery){
System.out.print(num + " ");
}
// 可能输出:4 7 23 15
3.2 TreeSet 的排序之道
TreeSet<String> sortedSet = new TreeSet<>(Arrays.asList("Java","Python","C++"));
// 正序遍历
sortedSet.forEach(s -> System.out.print(s + " → ")); // C++ → Java → Python
// 逆序遍历
sortedSet.descendingSet().forEach(s -> System.out.print(s + " ← "));
第四章:Map 王朝的寻宝图
4.1 三套寻宝装备对比
| 装备类型 | 获取方式 | 适用场景 | 效率评估 ⏱️ |
|---|---|---|---|
| 钥匙串 | keySet() | 仅需键信息时 | ⭐⭐ |
| 藏宝图 | entrySet() | 需要键值对时 | ⭐⭐⭐⭐ |
| 宝物箱 | values() | 仅需值时 | ⭐⭐ |
4.2 HashMap 实战
Map<String, Double> salaryMap = new HashMap<>();
salaryMap.put("张伟", 15000.0);
salaryMap.put("诸葛大力", 25000.5);
// 黄金搭档 entrySet
for(Map.Entry<String, Double> entry : salaryMap.entrySet()){
System.out.printf("%s 💴 月薪:%.2f元%n",
entry.getKey(), entry.getValue());
}
// Lambda 炫技版
salaryMap.forEach((k,v) -> System.out.println(k + " -> " + v));
第五章:并发遍历红黑榜
5.1 危险操作 TOP3
// 错误示范:遍历时删除(普通 for)
List<String> list = new ArrayList<>(Arrays.asList("A","B","C"));
for(int i=0; i<list.size(); i++){
if(list.get(i).equals("B")) list.remove(i); // 引发 ConcurrentModificationException 💥
}
// 正确姿势 ✅
Iterator<String> safeIt = list.iterator();
while(safeIt.hasNext()){
if(safeIt.next().equals("B")) safeIt.remove();
}
5.2 线程安全装备库
graph TB
A[并发集合] --> B[CopyOnWriteArrayList]
A --> C[ConcurrentHashMap]
A --> D[ConcurrentSkipListSet]
B --> E(写时复制技术)
C --> F(分段锁机制)
D --> G(跳表结构)
第六章:遍历性能天梯榜
| 遍历方式 | 时间复杂度 | 内存消耗 | 推荐场景 |
|---|---|---|---|
| 普通 for | O(n) | 低 | ArrayList 随机访 |
| 迭代器 | O(n) | 低 | 通用删除操作 |
| 增强 for | O(n) | 中 | 快速只读遍历 |
| Lambda | O(n) | 高 | 链式数据处理 |
| 并行流 | O(n/p) | 高 | 大数据量处理 |
🚨 祖师爷的忠告
-
不要用魔法修改集合
// 黑魔法预警!⚡ list.forEach(x -> { if(x.equals("bug")) list.remove(x); // 会炸!💥 }); -
慎用并行流遍历
// 可能引发数据混乱! list.parallelStream().forEach(System.out::println);
🎉 下集预告:集合流式编程革命
// Stream API 炫技预览
list.parallelStream()
.filter(s -> s.length()>3)
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
🌟 编程哲学:遍历不是目的,高效处理数据才是终极奥义,没有最好的遍历方式,只有最合适的场景! 🧠💫