核心收获熟练掌握 Java 集合框架List, Set, Map练习1 — List 去重与保留顺序移除列表中的重复元素并保持首次出现的顺序使用 LinkedHashSet 构造函数或 Stream 的 distinct()对比 HashSet 丢失顺序的场景。//练习1List去重与保留顺序//测试数据ListStringduplicateListArrays.asList(A,B,A,C,B,D,E,T,G,F,Y,G);//方法1使用LinkedHashSet(底层基于插入顺序的哈希表天然保序)ListStringdistinctWithOrderOnenewArrayList(newLinkedHashSet(duplicateList));System.out.println(LinkedHashSet去重保序结果distinctWithOrderOne);//方法2使用Stream.distinct()(底层基于LinkedHashSet实现同样保序)ListStringdistinctWithOrderTwoduplicateList.stream().distinct().collect(Collectors.toList());System.out.println(Stream.distinct()去重保序结果distinctWithOrderTwo);//方法3对比普通HashSet会丢失插入顺序ListStringdistinctNoOrdernewArrayList(newHashSet(duplicateList));System.out.println(HashSet去重丢失顺序结果distinctNoOrder);//输出结果//LinkedHashSet去重保序结果[A, B, C, D, E, T, G, F, Y]//Stream.distinct()去重保序结果[A, B, C, D, E, T, G, F, Y]//HashSet去重丢失顺序结果[A, B, C, D, E, F, G, T, Y]练习2 — Map 安全获取与默认值从 Map 中获取用户配置若 Key 不存在则返回默认配置对象使用 Map.getOrDefault() 或 computeIfAbsent() 避免空指针异常NPE。//练习2Map的安全获取与默认值//测试数据MapString,StringuserConfignewHashMap();userConfig.put(theme,dark);userConfig.put(fontSize,16);//方法1getOrDefault,仅查询不写入MapStringthemeuserConfig.getOrDefault(theme,light);StringunknownKeyuserConfig.getOrDefault(unknownKey,defaultValue);System.out.println(theme配置theme);System.out.println(不存在的key默认值unknownKey);//方法2computeIfAbsent,若key不存在则写入默认值到Map,后续直接复用StringcacheConfiguserConfig.computeIfAbsent(cacheExpire,k-3600);System.out.println(新增的缓存配置cacheConfig);System.out.println(Map最终内容userConfig);//输出结果//theme配置dark//不存在的key默认值defaultValue//新增的缓存配置3600//Map最终内容{cacheExpire3600, themedark, fontSize16}练习3 — 集合求交集与差集找出两个用户标签列表List的共同标签交集和独有标签差集使用 retainAll() / removeAll() 或 Stream 的 filter contains注意大数据量下的性能优化转为 HashSet 查找。//练习3集合求交集与差集//测试数据ListStringtagsOnenewArrayList(Arrays.asList(Java,Spring,AI,MySQL));ListStringtagsTwonewArrayList(Arrays.asList(Spring,Redis,Java,Kafka));//性能优化先转HashSet,将contains操作从O(n)降为O(1)适配大数据量场景SetStringtagSetOnenewHashSet(tagsOne);SetStringtagSetTwonewHashSet(tagsTwo);//1:求交集(共同标签)SetStringintersectionnewHashSet(tagSetOne);intersection.retainAll(tagSetTwo);System.out.println(共同标签intersection);//2:求差集(tagOne独有的标签)SetStringdifferencenewHashSet(tagSetOne);difference.removeAll(tagSetTwo);System.out.println(tagOne独有的标签difference);//3:Stream写法实现交集ListStringstreamIntersectiontagsOne.stream().filter(tagSetTwo::contains).collect(Collectors.toList());System.out.println(Stream实现交集streamIntersection);//4:Stream写法实现差集ListStringstreamDifferencetagsOne.stream().filter(tag-!tagSetTwo.contains(tag)).collect(Collectors.toList());System.out.println(Stream实现差集streamDifference);//输出结果//共同标签[Java, Spring]//tagOne独有的标签[MySQL, AI]//Stream实现交集[Java, Spring]//Stream实现差集[AI, MySQL]练习4 — List 转 Map 分组与映射将订单列表按“状态”分组统计总金额使用 Collectors.groupingBy 嵌套 Collectors.summingDouble或将列表直接转为 MapID, Object 以便快速查找使用 Collectors.toMap 并处理键冲突策略。//练习4:List转Map分组与映射//测试数据ListOrderordersArrays.asList(newOrder(1L,1,99.9),newOrder(2L,1,199.9),newOrder(3L,2,299.9),newOrder(4L,2,399.9));//1按订单状态分组统计每个状态的总金额MapInteger,DoublestatusTotalMaporders.stream().collect(Collectors.groupingBy(Order::status,Collectors.summingDouble(Order::amount)));System.out.println(按订单状态分组总金额statusTotalMap);//2:转成ID-订单的快速查找Map处理键冲突MapLong,OrderidToOrderMaporders.stream().collect(Collectors.toMap(Order::id,order-order,(oldVal,newVal)-oldVal));System.out.println(ID映射订单Map:idToOrderMap);//输出结果//按订单状态分组总金额{1299.8, 2699.8}//ID映射订单Map:{1Order[id1, status1, amount99.9],// 2Order[id2, status1, amount199.9],// 3Order[id3, status2, amount299.9],// 4Order[id4, status2, amount399.9]}