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

Java遍历Card对象ArrayList时仅输出对象引用而非属性值怎么办

问题根因

你看到的com.company.Card@4517d9a3不是对象引用地址,是Java中所有类的顶层父类Object自带的toString()方法的默认返回值,格式固定为类全限定名@对象哈希码的十六进制字符串。
这个问题和你用迭代器遍历还是普通for循环遍历没有关系,核心原因是你自定义的Card类没有重写toString()方法。当你调用String.valueOf(iterator.next())做类型转换时,本质会调用Card对象的toString()方法拿到字符串表示,没有重写的情况下就会返回默认格式的内容。

解决方案

二选一即可:

方案1:重写Card类的toString()方法(推荐)

在Card类中新增重写的toString()方法,自定义需要展示的花色、点数属性拼接规则,之后所有打印Card对象的场景都会自动输出你定义的内容,不需要修改遍历逻辑。
修改后的Card类代码如下:

public class Card {
    private CardSuit cardSuit;
    private CardValue cardValue;

    public Card(CardSuit cardSuit,  CardValue cardValue) {
        this.cardValue = cardValue;
        this.cardSuit = cardSuit;
    }

    public CardValue getCardValue() {
        return cardValue;
    }

    public CardSuit getCardSuit() {
        return cardSuit;
    }

    // 新增重写的toString方法
    @Override
    public String toString() {
        // 输出格式可根据需求自定义,比如调整为"红桃A"这类可读格式
        return cardSuit + " " + cardValue;
    }
}

补充说明:如果CardSuit、CardValue是自定义枚举/类,也需要保证它们的toString()返回的是可展示的文本内容,否则这两个字段还是会输出默认的类名+哈希值格式。

方案2:打印时手动拼接属性(不修改Card类)

如果你不想改动Card类的原有代码,就不要直接转换整个Card对象为字符串,在遍历时手动调用getter方法拿到花色、点数属性,拼接成需要的格式再打印。
修改后的showCards方法:

public static void showCards(ArrayList<Card> cards){
    // 建议给迭代器加上泛型,避免类型转换风险
    Iterator<Card> iterator = cards.iterator();
    while(iterator.hasNext()){
        Card card = iterator.next();
        // 自定义输出格式
        String printContent = card.getCardSuit() + " " + card.getCardValue();
        System.out.println(printContent);
    }
}

内容的提问来源于stack exchange,提问作者megabyt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 00:27:23