Java 集合框架大师课:遍历宇宙的降龙十八掌(二)

159 阅读2分钟

🌟 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(跳表结构)

第六章:遍历性能天梯榜

遍历方式时间复杂度内存消耗推荐场景
普通 forO(n)ArrayList 随机访
迭代器O(n)通用删除操作
增强 forO(n)快速只读遍历
LambdaO(n)链式数据处理
并行流O(n/p)大数据量处理

🚨 祖师爷的忠告

  1. 不要用魔法修改集合

    // 黑魔法预警!⚡
    list.forEach(x -> {
        if(x.equals("bug")) list.remove(x); // 会炸!💥
    });
    
  2. 慎用并行流遍历

    // 可能引发数据混乱!
    list.parallelStream().forEach(System.out::println); 
    

🎉 下集预告:集合流式编程革命

// Stream API 炫技预览
list.parallelStream()
    .filter(s -> s.length()>3)
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

🌟 编程哲学:遍历不是目的,高效处理数据才是终极奥义,没有最好的遍历方式,只有最合适的场景! 🧠💫