HashMap转换核心是按需提取key、value或entry,再转为List/Set/数组;注意可变性、顺序与类型安全,推荐Stream API,keySet()天然为Set,toArray需传入带类型空数组。

HashMap 转换为其他集合类型,核心在于区分你要提取的是键(key)、值(value)还是键值对(entry),再按需转成 List、Set 或数组。转换本身不复杂,但要注意可变性、顺序和类型安全。
转成 List:提取 key 或 value 最常用
直接用构造函数或 Stream API 都可以,推荐后者更灵活:
- 转 key 列表:new ArrayList(map.keySet()) 或 map.keySet().stream().collect(Collectors.toList())
- 转 value 列表:new ArrayList(map.values()) 或 map.values().stream().collect(Collectors.toList())
注意:Arrays.asList(map.values().toArray()) 不推荐——容易因泛型擦除导致类型问题;且 values() 返回的是 Collection,本身已支持直接构造。
转成 Set:天然适配,去重且高效
HashMap 的 keySet() 本身就是 Set 类型(通常是 LinkedHashSet 或 HashMap.KeySet 视图),所以:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- key 集合可直接赋值:Set<K> keySet = map.keySet();(视图,非副本)
- 如需独立可修改副本:new HashSet(map.keySet()) 或 new LinkedHashSet(map.keySet())(保留插入顺序)
- value 转 Set:new HashSet(map.values()),自动去重
转成数组:明确类型,避免 ClassCastException
不能直接用 map.values().toArray() 得到 String[] 等具体类型数组,必须传入带类型的空数组:
- String 值转数组:String[] arr = map.values().toArray(new String[0]);
- Integer 键转数组:Integer[] keys = map.keySet().toArray(new Integer[0]);
用 new Type[0] 比 new Type[map.size()] 更安全,避免扩容开销,JVM 会自动优化。
转成 List<Map.Entry>:保留键值对结构
当需要遍历或排序整个映射关系时,entrySet() 是关键入口:
- new ArrayList(map.entrySet()) —— 得到有序列表(插入顺序由 map 实现决定,如 LinkedHashMap 保持顺序,HashMap 不保证)
- 配合 Stream 排序:map.entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList())
Entry 列表里的每个元素是 Map.Entry<K,V>,可通过 getKey() 和 getValue() 安全访问。

















