Java 集合容器实操技巧与案例详解

本文涉及的产品
轻量应用服务器 2vCPU 4GiB,适用于网站搭建
轻量应用服务器 2vCPU 4GiB,适用于搭建Web应用/小程序
轻量应用服务器 2vCPU 1GiB,适用于搭建电商独立站
简介: 本教程基于Java 8+新特性和现代开发实践,深入讲解Java集合容器的实操技巧。通过具体场景演示Stream API数据处理、ConcurrentHashMap并发控制、LinkedHashMap实现LRU缓存、TreeSet自定义排序等高级特性。同时涵盖computeIfAbsent优化操作、EnumMap专用集合使用、集合统计与运算(交集、并集、差集)等内容。代码示例丰富,助力掌握高效编程方法。[点击获取完整代码](https://pan.quark.cn/s/14fcf913bae6)。

我将基于Java 8+的新特性和现代开发实践,结合实际场景,为你提供Java集合容器的实操内容。以下代码展示了如何使用Java集合框架的高级特性解决实际问题。

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;

public class CollectionPractice {
   

    // 1. 使用Stream API处理集合
    public static void streamApiExample() {
   
        List<String> words = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");

        // 过滤长度大于5的单词,转换为大写,收集到新列表
        List<String> filteredWords = words.stream()
                .filter(word -> word.length() > 5)
                .map(String::toUpperCase)
                .collect(Collectors.toList());

        System.out.println("过滤后的单词: " + filteredWords);

        // 计算所有单词的字符总数
        int totalLength = words.stream()
                .mapToInt(String::length)
                .sum();

        System.out.println("字符总数: " + totalLength);

        // 按长度分组单词
        Map<Integer, List<String>> wordsByLength = words.stream()
                .collect(Collectors.groupingBy(String::length));

        System.out.println("按长度分组: " + wordsByLength);
    }

    // 2. 使用ConcurrentHashMap处理并发场景
    public static void concurrentHashMapExample() {
   
        ConcurrentHashMap<String, Integer> wordCounts = new ConcurrentHashMap<>();
        List<String> documents = Arrays.asList(
                "Java is a popular programming language",
                "Python is another popular programming language",
                "Java and Python are widely used in data science"
        );

        // 并行处理文档,统计单词频率
        documents.parallelStream()
                .flatMap(doc -> Arrays.stream(doc.split(" ")))
                .forEach(word -> wordCounts.compute(word, (k, v) -> v == null ? 1 : v + 1));

        System.out.println("单词频率统计: " + wordCounts);
    }

    // 3. 使用LinkedHashMap实现LRU缓存
    public static void lruCacheExample() {
   
        // 容量为3的LRU缓存
        LinkedHashMap<String, String> lruCache = new LinkedHashMap<String, String>(3, 0.75f, true) {
   
            @Override
            protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
   
                return size() > 3;
            }
        };

        lruCache.put("key1", "value1");
        lruCache.put("key2", "value2");
        lruCache.put("key3", "value3");
        System.out.println("缓存内容: " + lruCache);

        // 访问key2,使其变为最近使用
        lruCache.get("key2");
        System.out.println("访问key2后: " + lruCache);

        // 添加新元素,触发LRU淘汰
        lruCache.put("key4", "value4");
        System.out.println("添加key4后: " + lruCache); // key1应被淘汰
    }

    // 4. 使用TreeSet对自定义对象排序
    public static void treeSetSortingExample() {
   
        // 按价格排序的商品集合
        TreeSet<Product> products = new TreeSet<>(Comparator.comparingDouble(Product::getPrice));
        products.add(new Product("Laptop", 1200.0));
        products.add(new Product("Mouse", 25.0));
        products.add(new Product("Monitor", 300.0));

        System.out.println("按价格排序的商品:");
        products.forEach(System.out::println);
    }

    // 5. 使用Map的computeIfAbsent方法优化缓存加载
    public static void computeIfAbsentExample() {
   
        Map<String, List<String>> userRoles = new HashMap<>();

        // 传统方式
        String username = "admin";
        List<String> roles = userRoles.get(username);
        if (roles == null) {
   
            roles = new ArrayList<>();
            userRoles.put(username, roles);
        }
        roles.add("ADMIN");
        roles.add("USER");

        // 使用computeIfAbsent简化
        userRoles.computeIfAbsent("user1", k -> new ArrayList<>()).add("USER");

        System.out.println("用户角色: " + userRoles);
    }

    // 6. 使用EnumMap存储枚举值映射
    public static void enumMapExample() {
   
        enum Weekday {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }

        EnumMap<Weekday, String> schedule = new EnumMap<>(Weekday.class);
        schedule.put(Weekday.MONDAY, "Meeting");
        schedule.put(Weekday.TUESDAY, "Training");
        schedule.put(Weekday.WEDNESDAY, "Project work");

        System.out.println("周三安排: " + schedule.get(Weekday.WEDNESDAY));
    }

    // 7. 使用集合进行数据统计
    public static void statisticsExample() {
   
        List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5);

        // 使用IntSummaryStatistics进行统计
        IntSummaryStatistics stats = numbers.stream()
                .mapToInt(Integer::intValue)
                .summaryStatistics();

        System.out.println("统计信息:");
        System.out.println("总数: " + stats.getCount());
        System.out.println("总和: " + stats.getSum());
        System.out.println("平均值: " + stats.getAverage());
        System.out.println("最大值: " + stats.getMax());
        System.out.println("最小值: " + stats.getMin());
    }

    // 8. 使用集合去重和转换
    public static void distinctAndMapExample() {
   
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Alice", "David");

        // 去重并转换为大写
        List<String> uniqueNames = names.stream()
                .distinct()
                .map(String::toUpperCase)
                .collect(Collectors.toList());

        System.out.println("去重并大写后的名字: " + uniqueNames);
    }

    // 9. 使用队列实现任务调度
    public static void queueExample() {
   
        // 优先队列(最小堆)
        PriorityQueue<Task> taskQueue = new PriorityQueue<>(Comparator.comparingInt(Task::getPriority));
        taskQueue.add(new Task("Task 1", 3));
        taskQueue.add(new Task("Task 2", 1));
        taskQueue.add(new Task("Task 3", 2));

        System.out.println("任务执行顺序:");
        while (!taskQueue.isEmpty()) {
   
            System.out.println(taskQueue.poll());
        }
    }

    // 10. 使用集合交集、并集和差集操作
    public static void setOperationsExample() {
   
        Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
        Set<Integer> set2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8));

        // 交集
        Set<Integer> intersection = new HashSet<>(set1);
        intersection.retainAll(set2);
        System.out.println("交集: " + intersection);

        // 并集
        Set<Integer> union = new HashSet<>(set1);
        union.addAll(set2);
        System.out.println("并集: " + union);

        // 差集
        Set<Integer> difference = new HashSet<>(set1);
        difference.removeAll(set2);
        System.out.println("差集 (set1 - set2): " + difference);
    }

    public static void main(String[] args) {
   
        System.out.println("=== Stream API示例 ===");
        streamApiExample();

        System.out.println("\n=== ConcurrentHashMap示例 ===");
        concurrentHashMapExample();

        System.out.println("\n=== LRU缓存示例 ===");
        lruCacheExample();

        System.out.println("\n=== TreeSet排序示例 ===");
        treeSetSortingExample();

        System.out.println("\n=== computeIfAbsent示例 ===");
        computeIfAbsentExample();

        System.out.println("\n=== EnumMap示例 ===");
        enumMapExample();

        System.out.println("\n=== 统计示例 ===");
        statisticsExample();

        System.out.println("\n=== 去重和转换示例 ===");
        distinctAndMapExample();

        System.out.println("\n=== 队列示例 ===");
        queueExample();

        System.out.println("\n=== 集合操作示例 ===");
        setOperationsExample();
    }

    // 商品类,用于TreeSet示例
    static class Product {
   
        private String name;
        private double price;

        public Product(String name, double price) {
   
            this.name = name;
            this.price = price;
        }

        public double getPrice() {
   
            return price;
        }

        @Override
        public String toString() {
   
            return name + ": $" + price;
        }
    }

    // 任务类,用于队列示例
    static class Task {
   
        private String name;
        private int priority;

        public Task(String name, int priority) {
   
            this.name = name;
            this.priority = priority;
        }

        public int getPriority() {
   
            return priority;
        }

        @Override
        public String toString() {
   
            return name + " (优先级: " + priority + ")";
        }
    }
}

上述代码展示了Java集合容器的现代使用方式,包括:

  1. Stream API的使用:通过流式操作过滤、映射和收集集合元素,实现复杂的数据处理。
  2. 并发集合:使用ConcurrentHashMap在多线程环境中高效地处理共享数据。
  3. LRU缓存实现:通过LinkedHashMap的访问顺序特性实现LRU缓存策略。
  4. 自定义排序:使用TreeSetComparator对自定义对象进行排序。
  5. 集合操作优化:利用computeIfAbsent等方法简化集合操作,避免空值检查。
  6. 专用集合:展示EnumMap等针对特定场景优化的集合类。
  7. 统计功能:使用IntSummaryStatistics等工具类进行数据统计。
  8. 集合运算:实现集合的交集、并集和差集操作。

这些示例覆盖了日常开发中常见的场景,展示了如何利用Java集合框架的高级特性编写简洁、高效的代码。


Java 集合框架,ArrayList,HashMap,LinkedList,HashSet,ConcurrentHashMap, 集合性能优化,集合线程安全,集合遍历技巧,集合排序,集合去重,集合转换,Java 集合面试题,Java8 集合新特性,集合实战案例



代码获取方式
https://pan.quark.cn/s/14fcf913bae6


相关文章
|
27天前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
204 3
|
30天前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
389 1
|
1月前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
312 1
|
1月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
152 7
|
1月前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
283 0
|
1月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
126 3
|
1月前
|
监控 Kubernetes Java
最新技术栈驱动的 Java 绿色计算与性能优化实操指南涵盖内存优化与能效提升实战技巧
本文介绍了基于Java 24+技术栈的绿色计算与性能优化实操指南。主要内容包括:1)JVM调优,如分代ZGC配置和结构化并发优化;2)代码级优化,包括向量API加速数据处理和零拷贝I/O;3)容器化环境优化,如K8s资源匹配和节能模式配置;4)监控分析工具使用。通过实践表明,这些优化能显著提升性能(响应时间降低40-60%)同时降低资源消耗(内存减少30-50%,CPU降低20-40%)和能耗(服务器功耗减少15-35%)。建议采用渐进式优化策略。
111 1
|
2月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
129 1
|
1月前
|
人工智能 自然语言处理 Java
面向 Java 开发者:2024 最新技术栈下 Java 与 AI/ML 融合的实操详尽指南
Java与AI/ML融合实践指南:2024技术栈实战 本文提供了Java与AI/ML融合的实操指南,基于2024年最新技术栈(Java 21、DJL 0.27.0、Spring Boot 3.2等)。主要内容包括: 环境配置:详细说明Java 21、Maven依赖和核心技术组件的安装步骤 图像分类服务:通过Spring Boot集成ResNet-50模型,实现REST接口图像分类功能 智能问答系统:展示基于RAG架构的文档处理与向量检索实现 性能优化:利用虚拟线程、GraalVM等新技术提升AI服务性能 文
161 0
|
1月前
|
Web App开发 Rust 前端开发
WebAssembly 与 Java 结合实操指南 基于最新工具链的跨语言开发实践教程
WebAssembly与Java集成实操指南 本文基于2024年最新工具链(GraalVM、TeaVM、Wasmtime),提供两种Java与Wasm结合的实践方案: Java调用Wasm模块:通过Rust编写高性能加密算法并编译为Wasm,在Java中利用Wasmtime运行时进行调用,实现6.7倍的性能提升。重点演示了Wasm内存模型操作和指针传递机制。 Java编译为Wasm:使用TeaVM将Java科学计算代码编译为Wasm模块,供浏览器前端直接调用。包含完整的Maven配置和前端调用示例,特别适合
138 0