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

Java中如何打印栈?打印输出哈希码问题求解决

嘿,我完全懂你现在的困扰——打印栈里的元素时总是输出Problem1$Node@3d4eac69这类哈希码,根本看不到节点的实际内容对吧?别慌,这其实是Java对象默认的toString()方法在“搞怪”,咱们一步步来解决它:

问题根源

Java里所有类默认继承自Object类,而Object自带的toString()方法,默认返回的就是类名@十六进制哈希码格式的字符串。所以当你直接打印栈中的Node对象时,JVM就会调用这个默认方法,输出你看到的哈希码。

解决方案

1. 重写Node类的toString()方法

这是最关键的一步,你需要在Node类里自定义toString()方法,让它返回你想要展示的节点内容(比如节点的值、其他属性等)。举个例子,假设你的Node类有一个value属性,代码可以这么写:

static class Node {
    int value; // 假设你的节点存储了这个值
    Node next;
    
    // 你的构造方法、其他逻辑代码...
    
    @Override
    public String toString() {
        // 这里可以根据你的需求自定义输出格式
        return "Node{value=" + value + "}";
    }
}

重写之后,再打印Node对象,就会输出类似Node{value=10}这样的直观内容,而不是哈希码了。

2. 正确打印栈的方式

重写toString()之后,你有两种常见的打印方式:

  • 直接打印整个栈:Java的Stack类重写了toString(),会遍历所有元素并调用它们的toString(),所以直接打印栈就能得到所有节点的内容:
    System.out.println(stack);
    
  • 逐个遍历打印:如果需要更灵活的输出格式,可以用迭代器遍历栈(不会改变栈的原有内容),或者复制栈后弹出元素打印(避免清空原栈):
    // 方式1:用迭代器遍历
    Iterator<Node> iterator = stack.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
    
    // 方式2:复制栈后弹出打印(保留原栈)
    Stack<Node> tempStack = new Stack<>();
    tempStack.addAll(stack);
    while (!tempStack.isEmpty()) {
        System.out.println(tempStack.pop());
    }
    
完整示例片段

结合你的代码结构,这里给一个可运行的示例参考:

import java.util.*;

public class Problem1 {
    static class Node {
        int value;
        Node next;
        
        public Node(int value) {
            this.value = value;
        }
        
        // 重写toString方法
        @Override
        public String toString() {
            return "Node(value=" + value + ")";
        }
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int N = input.nextInt();
        Stack<Node> stack = new Stack<>();
        
        // 往栈中添加测试节点
        for (int i = 0; i < N; i++) {
            stack.push(new Node(input.nextInt()));
        }
        
        // 打印整个栈
        System.out.println("栈的完整内容:" + stack);
        
        // 逐个打印元素
        System.out.println("\n逐个打印栈元素:");
        for (Node node : stack) {
            System.out.println(node);
        }
        
        input.close();
    }
}

如果你的Node类还有其他自定义属性(比如next指针、额外标识等),只需要在toString()里把这些属性也加入返回字符串即可,完全可以根据自己的需求调整格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:26:31