Java HashMap<String,String[]> 如何输出键与对应字符串数组的所有元素
问题本质
直接打印mentry.getValue()输出数组哈希地址,是因为Java原生数组类型未重写Object类的toString()方法,和字符串拼接时会调用默认实现,输出格式为数组类型@十六进制哈希值,无法展示数组内部存储的学生姓名。
适配需求的修改方法
你的预期输出要求每个科目对应的学生姓名以空格分隔连为一行,无需额外符号,实现该需求最简便的方式是直接用JDK自带的工具方法处理数组内容,无需手动遍历数组逐个拼接。
最小改动版修改
保留你原有的迭代器遍历逻辑,仅做两处调整:
- 将原有不带泛型的原始类型
Set、Iterator替换为带泛型声明的类型,去掉冗余的强制类型转换,避免类型安全问题 - 打印时用
String.join(" ", mentry.getValue())替代直接拼接mentry.getValue()的逻辑,将字符串数组的所有元素以空格为间隔拼接成普通字符串
修改后的遍历代码片段:
// 带泛型的集合声明,无需手动强转 Set<Map.Entry<String, String[]>> set = this.subjects.entrySet(); Iterator<Map.Entry<String, String[]>> iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry<String, String[]> mentry = iterator.next(); // 用String.join将数组元素按空格拼接,完全匹配预期输出格式 String allStudents = String.join(" ", mentry.getValue()); System.out.println(mentry.getKey() + " : " + allStudents); }
简化版修改(适配JDK 8及以上版本)
如果项目使用JDK 8或更高版本,可以直接用Map自带的forEach方法简化遍历逻辑,无需手动创建迭代器:
public void initialDetails() { this.subjects.put("English", new String[] {"Alex Lamplough", "Kayleigh Lamplough", "Bella Lamplough"}); // 其余原有put操作保持不变 this.subjects.forEach((subject, studentArr) -> { String studentStr = String.join(" ", studentArr); System.out.println(subject + " : " + studentStr); }); }
注意事项
- 不要直接使用
Arrays.toString(mentry.getValue())替代打印逻辑,该方法的默认输出会带方括号、逗号分隔符(例如[Alex Lamplough, Kayleigh Lamplough]),和要求的纯空格分隔的输出格式不匹配,需要额外做字符串替换才能达到效果,不如直接用String.join简便。 - 不要手动写循环遍历数组逐个拼接字符串,重复代码多且容易出现首尾多拼接空格的问题,
String.join是JDK专门为字符串数组拼接提供的工具方法,边界处理更可靠。
内容的提问来源于stack exchange,提问作者lammyalex
相关产品推荐
相关产品推荐

