(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)Java基础-集合-LMLPHP

目录

前言 

一、Java集合框架概述

二、Collection接口及其实现

2.1 Collection接口

2.2 List接口及其实现

2.3 Set接口及其实现

三、Map接口及其实现

3.1 Map的基本操作

四、集合的遍历与迭代

4.1 使用for-each循环遍历

4.2 使用迭代器遍历

4.3 使用分割器遍历(Java 8+)

五、Spliterator的高级应用

5.1 Spliterator简介

5.2 Spliterator的特性

5.3 使用Spliterator

六、并发集合

6.1 并发集合概览

6.2 并发集合的使用场景

6.3 并发集合与Spliterator的集成


前言 

一、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不是线程安全的,上面的代码在并行流中可能会导致输出混乱。  
    // 在实际应用中,应该使用线程安全的操作或收集器。  
}

六、并发集合

6.1 并发集合概览

6.2 并发集合的使用场景

6.3 并发集合与Spliterator的集成

11-19 02:20