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
相关产品推荐
相关产品推荐

