前面简单罗列了 Java 集合框架中的重要接口,下面将通过 3 个真实场景,分别演示 List、Set、Map 三种核心集合的基础用法,让你直观感受集合框架的便捷与魅力,快速了解 Java 集合的基础用法。
老师需要记录一个班级 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
电商平台的 “热销商品列表” 中,由于数据同步问题,出现了重复的商品 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在热销列表中
社交 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 | 无序、不可重复、无索引 | 商品去重、用户 ID 过滤 | 需要去重或快速判断元素存在 |
Map | 键值对、Key 唯一、Value 可重复 | 用户信息查询、配置存储 | 需要通过唯一 Key 关联数据 |
注意,Java 集合框架不是抽象的概念,而是解决实际问题的 “工具包”:
当你需要 “按顺序存数据,允许重复” 时,用 List;
当你需要 “去重或判断元素是否存在” 时,用 Set;
当你需要 “通过唯一标识找数据” 时,用 Map。