You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打印以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:32:16