如何打印以TickerSymbol为键、ETF列表为值的HashMap内容?
解决HashMap存储自定义类型的打印问题
嘿,我来帮你搞定这个HashMap打印的问题!你遇到的乱码和空指针异常,大概率是两个原因导致的:一是自定义的TickerSymbol和ETF类没重写toString()方法,二是存储的List<ETF>可能为null。咱们一步步来解决:
1. 给自定义类重写toString()方法
默认情况下,Java类的toString()会输出类名@哈希码的格式,这就是你看到的“乱码”。给自定义类重写这个方法,就能输出有意义的内容了:
class TickerSymbol { private String symbol; // 构造器、Getter/Setter public TickerSymbol(String symbol) { this.symbol = symbol; } @Override public String toString() { return "股票代码: " + symbol; // 你可以自定义输出格式,比如包含更多字段 } } class ETF { private String etfName; private double netValue; // 构造器、Getter/Setter public ETF(String etfName, double netValue) { this.etfName = etfName; this.netValue = netValue; } @Override public String toString() { return String.format("ETF{名称='%s', 净值=%.2f}", etfName, netValue); } }
2. 避免List<ETF>为null(解决NullPointerException)
如果往HashMap中添加元素时,直接put了一个null的List,后续打印时就会触发空指针。推荐用computeIfAbsent方法来自动初始化List,确保每个键对应的List都不为null:
public static void main(String[] args){ Map<TickerSymbol, List<ETF>> exampleMap = new HashMap<>(); // 正确添加元素的方式:自动初始化List TickerSymbol apple = new TickerSymbol("AAPL"); exampleMap.computeIfAbsent(apple, k -> new ArrayList<>()).add(new ETF("SPY", 512.34)); exampleMap.computeIfAbsent(apple, k -> new ArrayList<>()).add(new ETF("QQQ", 420.15)); TickerSymbol google = new TickerSymbol("GOOGL"); exampleMap.computeIfAbsent(google, k -> new ArrayList<>()).add(new ETF("VOO", 405.67)); }
3. 几种安全的打印方式
现在你可以用以下几种方式正常打印HashMap的内容了:
方式一:直接打印整个Map
重写toString后,直接打印Map就能输出清晰的结构:
System.out.println(exampleMap);
输出示例:
{股票代码: AAPL=[ETF{名称='SPY', 净值=512.34}, ETF{名称='QQQ', 净值=420.15}], 股票代码: GOOGL=[ETF{名称='VOO', 净值=405.67}]}
方式二:遍历EntrySet逐个打印(更灵活)
如果需要更规整的格式,可以遍历Map的键值对:
for (Map.Entry<TickerSymbol, List<ETF>> entry : exampleMap.entrySet()) { System.out.println("=== " + entry.getKey() + " ==="); // 遍历ETF列表逐个打印 for (ETF etf : entry.getValue()) { System.out.println(" " + etf); } }
输出示例:
=== 股票代码: AAPL ===
ETF{名称='SPY', 净值=512.34}
ETF{名称='QQQ', 净值=420.15}
=== 股票代码: GOOGL ===
ETF{名称='VOO', 净值=405.67}
方式三:用Java 8+的Lambda简化遍历
如果喜欢简洁的写法,用forEach配合Lambda表达式:
exampleMap.forEach((ticker, etfs) -> { System.out.println("当前股票代码: " + ticker); etfs.forEach(etf -> System.out.println(" 关联ETF: " + etf)); });
内容的提问来源于stack exchange,提问作者Stephan
相关产品推荐
相关产品推荐

