Java 集合教程

Java 集合:快速入门

前面简单罗列了 Java 集合框架中的重要接口,下面将通过 3 个真实场景,分别演示 List、Set、Map 三种核心集合的基础用法,让你直观感受集合框架的便捷与魅力,快速了解 Java 集合的基础用法。

场景1:班级学生成绩排名

需求描述

老师需要记录一个班级 10 名学生的数学成绩,要求能实现以下功能:

  • 添加所有学生的成绩;

  • 查看成绩的原始录入顺序;

  • 对成绩从高到低排序;

  • 获取成绩的最高分和最低分。

功能实现

根据需求分析,可选用 List 来实现该功能。因为 List 是有序、可重复的集合,支持通过索引访问元素,非常适合需要“保留顺序”和“允许重复数据”的场景(比如一个班级可能有多名学生考相同分数)。常用的 List 实现类是 ArrayList(查询快,增删慢)和 LinkedList(增删快,查询慢),这里选择 ArrayList 就可以了。

代码实现:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class StudentScoreManager {
    
    public static void main(String[] args) {
        // 1. 创建List集合,存储Integer类型的成绩
        List<Integer> mathScores = new ArrayList<>();

        // 2. 添加成绩(有序存储,允许重复)
        mathScores.add(85);  // 索引0
        mathScores.add(92);  // 索引1
        mathScores.add(78);  // 索引2
        mathScores.add(92);  // 索引3(允许重复)
        mathScores.add(88);  // 索引4
        mathScores.add(65);  // 索引5
        mathScores.add(95);  // 索引6
        mathScores.add(80);  // 索引7
        mathScores.add(75);  // 索引8
        mathScores.add(90);  // 索引9

        // 3. 查看原始录入顺序(通过循环遍历)
        System.out.println("原始成绩顺序:");
        for (int i = 0; i < mathScores.size(); i++) {
            System.out.print(mathScores.get(i) + " ");  // get(i)通过索引获取元素
        }

        // 4. 对成绩排序(使用 Collections 工具类)
        Collections.sort(mathScores);  // 默认升序排序
        System.out.println("\n升序排序后:");
        for (Integer score : mathScores) {
            System.out.print(score + " ");
        }

        // 5. 获取最高分和最低分(排序后首尾元素)
        int minScore = mathScores.get(0);  // 第一个元素是最低分
        int maxScore = mathScores.get(mathScores.size() - 1);  // 最后一个元素是最高分
        System.out.println("\n最低分:" + minScore + ",最高分:" + maxScore);
    }
    
}

运行结果:

原始成绩顺序:
85 92 78 92 88 65 95 80 75 90 
升序排序后:
65 75 78 80 85 88 90 92 92 95 
最低分:65,最高分:95

  

场景2:电商商品去重

需求描述

电商平台的 “热销商品列表” 中,由于数据同步问题,出现了重复的商品 ID(如 “iphone15” 出现了 3 次)。要求:

  • 去除列表中的重复商品 ID。

  • 快速判断某个商品是否在列表中。

  • 不需要保留商品的原始顺序。

功能实现

根据需求分析,可选用 Set 来实现该功能。因为 Set 是无序、不可重复的集合,它会自动过滤重复元素,且判断“元素是否存在”的效率极高。常用的 Set 实现类是 HashSet(无序,基于哈希表)和 TreeSet(有序,基于红黑树),这里不需要顺序,选择 HashSet 实现。

代码实现:

import java.util.HashSet;
import java.util.Set;

public class ProductDeduplication {
    
    public static void main(String[] args) {
        // 1. 模拟有重复的商品ID列表
        String[] duplicateProductIds = {
            "iphone15", "huawei-mate70", "iphone15", 
            "xiaomi14", "huawei-mate70", "iphone15"
        };

        // 2. 创建Set集合,自动去重
        Set<String> uniqueProducts = new HashSet<>();

        // 3. 将重复的商品ID添加到Set中(重复元素会被自动过滤)
        for (String productId : duplicateProductIds) {
            boolean isAdded = uniqueProducts.add(productId);  // add()返回是否添加成功
            if (!isAdded) {
                System.out.println("重复商品ID:" + productId + ",已过滤");
            }
        }

        // 4. 查看去重后的商品列表(无序)
        System.out.println("\n去重后的商品ID:");
        for (String product : uniqueProducts) {
            System.out.print(product + " ");
        }

        // 5. 判断某个商品是否在列表中(contains()方法,效率高)
        String targetProduct = "iphone15";
        if (uniqueProducts.contains(targetProduct)) {
            System.out.println("\n商品" + targetProduct + "在热销列表中");
        } else {
            System.out.println("\n商品" + targetProduct + "不在热销列表中");
        }
    }
    
}

运行结果:

重复商品ID:iphone15,已过滤
重复商品ID:huawei-mate70,已过滤
重复商品ID:iphone15,已过滤

去重后的商品ID:
huawei-mate70 iphone15 xiaomi14 
商品iphone15在热销列表中

  

场景3:用户信息查询

需求描述

社交 APP 需要存储用户的 “账号-昵称” 对应关系,要求:

  • 通过账号快速查询对应的昵称;

  • 修改某个账号的昵称;

  • 删除一个无效账号;

  • 遍历所有账号和昵称。

功能实现

根据需求分析,可选用 Map 来实现该功能。因为 Map 是键值对(Key-Value) 集合,它的核心是“通过 Key 快速找到 Value”—— 就像通过身份证号(Key)找人名(Value)一样。Key 是唯一的(不能重复),Value 可以重复。常用的 Map 实现类有 HashMap(无序,效率高)和 TreeMap(有序),这里选择 HashMap,不需要保证顺序。

代码实现:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class UserInfoManager {
    
    public static void main(String[] args) {
        // 1. 创建Map集合,Key是账号(String),Value是昵称(String)
        Map<String, String> userMap = new HashMap<>();

        // 2. 添加用户信息(put(Key, Value),Key重复会覆盖Value)
        userMap.put("zhangsan123", "张三");
        userMap.put("lisi456", "李四");
        userMap.put("wangwu789", "王五");
        userMap.put("zhangsan123", "张三同学");  // Key重复,覆盖之前的“张三”

        // 3. 通过账号查询昵称(get(Key),Key不存在返回null)
        String account1 = "lisi456";
        String nickname1 = userMap.get(account1);
        System.out.println("账号" + account1 + "的昵称:" + nickname1);

        String account2 = "zhaoliu000";
        String nickname2 = userMap.get(account2);
        System.out.println("账号" + account2 + "的昵称:" + nickname2);

        // 4. 修改账号的昵称(再次put相同Key,覆盖Value)
        userMap.put("wangwu789", "王五大佬");
        System.out.println("修改后,账号wangwu789的昵称:" + userMap.get("wangwu789"));

        // 5. 删除无效账号(remove(Key),返回被删除的Value)
        String removedNickname = userMap.remove("zhangsan123");
        System.out.println("删除的账号zhangsan123,对应的昵称:" + removedNickname);

        // 6. 遍历所有用户信息(两种方式)
        // 方式1:先获取所有Key,再通过Key找Value
        Set<String> accounts = userMap.keySet();  // 获取所有Key的集合
        System.out.println("\n所有用户信息(方式1):");
        for (String account : accounts) {
            System.out.println("账号:" + account + ",昵称:" + userMap.get(account));
        }

        // 方式2:直接获取Key-Value对(更高效)
        System.out.println("\n所有用户信息(方式2):");
        for (Map.Entry<String, String> entry : userMap.entrySet()) {
            System.out.println("账号:" + entry.getKey() + ",昵称:" + entry.getValue());
        }
    }
}

运行结果:

账号lisi456的昵称:李四
账号zhaoliu000的昵称:null
修改后,账号wangwu789的昵称:王五大佬
删除的账号zhangsan123,对应的昵称:张三同学

所有用户信息(方式1):
账号:lisi456,昵称:李四
账号:wangwu789,昵称:王五大佬

所有用户信息(方式2):
账号:lisi456,昵称:李四
账号:wangwu789,昵称:王五大佬

  

List、Set、Map 的核心区别与选择建议

通过以上三个场景,我们可以清晰地总结出三种集合的核心区别,帮助你在实际开发中快速选择:

集合类型

核心特点

典型场景

关键选择依据

List

有序、可重复、有索引

成绩排名、待办清单

需要保留顺序或通过索引访问

Set

无序、不可重复、无索引

商品去重、用户 ID 过滤

需要去重或快速判断元素存在

Map

键值对、Key 唯一、Value 可重复

用户信息查询、配置存储

需要通过唯一 Key 关联数据

注意,Java 集合框架不是抽象的概念,而是解决实际问题的 “工具包”:

  • 当你需要 “按顺序存数据,允许重复” 时,用 List;

  • 当你需要 “去重或判断元素是否存在” 时,用 Set;

  • 当你需要 “通过唯一标识找数据” 时,用 Map。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号