Java如何重写Queue的toString()方法以正确打印含int数组的队列
解决Queue<int[]>打印显示数组地址的问题
问题根源在于:LinkedList(Queue的实现类)的默认toString()方法会调用每个元素的默认toString(),而int[]作为数组对象,其默认toString()输出的是内存地址标识(如[I@58d25a40)。
要实现可读的输出,你需要重写LinkedList的toString()方法(因为Queue是接口,无法直接重写其方法),以下是两种可行方案:
方案一:自定义LinkedList子类
创建一个继承自LinkedList的子类,重写toString()来处理数组元素:
import java.util.LinkedList; import java.util.Queue; import java.util.Arrays; class IntArrayQueue extends LinkedList<int[]> { @Override public String toString() { StringBuilder sb = new StringBuilder("["); boolean isFirst = true; for (int[] arr : this) { if (!isFirst) { sb.append(", "); } sb.append(Arrays.toString(arr)); isFirst = false; } sb.append("]"); return sb.toString(); } } // 使用示例 public class Main { public static void main(String[] args) { Queue<int[]> queue = new IntArrayQueue(); queue.add(new int[]{1, 2, 3}); queue.add(new int[]{4, 5}); System.out.println(queue); // 输出: [[1, 2, 3], [4, 5]] } }
方案二:使用匿名内部类
如果不想单独定义子类,可以直接用匿名内部类重写toString():
import java.util.LinkedList; import java.util.Queue; import java.util.Arrays; public class Main { public static void main(String[] args) { Queue<int[]> queue = new LinkedList<int[]>() { @Override public String toString() { StringBuilder sb = new StringBuilder("["); boolean isFirst = true; for (int[] arr : this) { if (!isFirst) { sb.append(", "); } sb.append(Arrays.toString(arr)); isFirst = false; } sb.append("]"); return sb.toString(); } }; queue.add(new int[]{1, 2}); queue.add(new int[]{3, 4, 5}); System.out.println(queue); // 输出: [[1, 2], [3, 4, 5]] } }
两种方案的核心逻辑都是:在重写的toString()中遍历队列元素(无需你在打印时手动遍历),用Arrays.toString()将每个int[]转换为可读的字符串格式,再拼接成队列的整体字符串。
内容的提问来源于stack exchange,提问作者abhijit
相关产品推荐
相关产品推荐

