题 打印Java数组最简单的方法是什么?


在Java中,数组不会覆盖 toString(),所以如果你试图直接打印一个,你得到className + @ +的十六进制 hashCode 数组的定义,如 Object.toString()

int[] intArray = new int[] {1, 2, 3, 4, 5};
System.out.println(intArray);     // prints something like '[I@3343c8b3'

但通常我们实际上想要更像的东西 [1, 2, 3, 4, 5]。这样做最简单的方法是什么?以下是一些示例输入和输出:

// array of primitives:
int[] intArray = new int[] {1, 2, 3, 4, 5};
//output: [1, 2, 3, 4, 5]

// array of object references:
String[] strArray = new String[] {"John", "Mary", "Bob"};
//output: [John, Mary, Bob]

1531
2018-01-03 20:39


起源


对于字符串以外的对象,您希望表示什么?调用toString的结果?引用与否? - Jon Skeet
是的对象将由他们的toString()方法表示,没有引号(只是编辑了示例输出)。 - Alex Spurling
在实践中,密切相关 stackoverflow.com/questions/29140402/... - Raedwald
奇怪的输出不一定是内存位置。就是这样 hashCode() 十六进制。看到 Object#toString()。 - 4castle
在java8中打印单维或多维数组检查 stackoverflow.com/questions/409784/... - i_am_zero


答案:


从Java 5开始就可以使用了 Arrays.toString(arr) 要么 Arrays.deepToString(arr) 对于数组中的数组。请注意 Object[] 版本调用 .toString() 在数组中的每个对象上。输出甚至以您要求的方式进行装饰。

例子:

简单数组:

String[] array = new String[] {"John", "Mary", "Bob"};
System.out.println(Arrays.toString(array));

输出:

[John, Mary, Bob]

嵌套数组:

String[][] deepArray = new String[][] {{"John", "Mary"}, {"Alice", "Bob"}};
System.out.println(Arrays.toString(deepArray));
//output: [[Ljava.lang.String;@106d69c, [Ljava.lang.String;@52e922]
System.out.println(Arrays.deepToString(deepArray));

输出:

[[John, Mary], [Alice, Bob]]

double 阵:

double[] doubleArray = { 7.0, 9.0, 5.0, 1.0, 3.0 };
System.out.println(Arrays.toString(doubleArray));

输出:

[7.0, 9.0, 5.0, 1.0, 3.0 ]

int 阵:

int[] intArray = { 7, 9, 5, 1, 3 };
System.out.println(Arrays.toString(intArray));

输出:

[7, 9, 5, 1, 3 ]

2042
2018-01-03 20:48



这也适用于多维数组。 - Alok Mishra
如果我们有一个字符串数组,并想要简单的输出怎么办?喜欢: String[] array = {"John", "Mahta", "Sara"},我们希望这个输出没有括号和逗号: John Mahta Sara? - Hengameh
@Hengameh:还有其他几种方法可以做到这一点,但我最喜欢的是这一个: javahotchocolate.com/notes/java.html#arrays-tostring 。 - Russ Bateman
仅供参考, Arrays.deepToString() 只接受一个 Object [] (或扩展的类数组 Object, 如 Integer,因此它不适用于原始数组类型 int []。但 Arrays.toString(<int array>) 适用于原始数组。 - Marcus
@Hengameh有一种专门用于此的方法。 System.out.println(String.join(" ", new String[]{"John", "Mahta", "Sara"})) 将打印 John Mahta Sara。 - dorukayhan


始终先检查标准库。尝试:

System.out.println(Arrays.toString(array));

或者如果您的数组包含其他数组作为元素:

System.out.println(Arrays.deepToString(array));

305
2018-05-12 21:01



如果我们有一个字符串数组,并想要简单的输出怎么办?喜欢: String[] array = {"John", "Mahta", "Sara"},我们希望这个输出没有括号和逗号: John Mahta Sara? - Hengameh
@Hengameh只需将Arrays.toString(数组)存储到字符串变量中,然后通过Java的replace方法删除大括号 - Naveed Ahmad
@Hengameh现在使用Java 8: String.join(" ", Arrays.asList(array))。 DOC - Justin


然而,很高兴知道,“总是首先检查标准库”,我从来没有偶然发现过 Arrays.toString( myarray )

- 因为我专注于myarray的类型,看看如何做到这一点。我不想迭代这件事:我想要一个简单的调用来使它类似于我在Eclipse调试器中看到的并且myarray.toString()就是没有这样做。

import java.util.Arrays;
.
.
.
System.out.println( Arrays.toString( myarray ) );

85
2018-02-06 23:35



如果我们有一个字符串数组,并想要简单的输出怎么办?喜欢: String[] array = {"John", "Mahta", "Sara"},我们希望这个输出没有括号和逗号: John Mahta Sara? - Hengameh
@Hengameh我认为这是另一个话题。您可以使用之后的常见字符串操作来操作此String ...与Arrays.toString(myarray).replace(“[”,“(”);依此类推。 - OddDev


在JDK1.8中,您可以使用聚合操作和lambda表达式:

String[] strArray = new String[] {"John", "Mary", "Bob"};

// #1
Arrays.asList(strArray).stream().forEach(s -> System.out.println(s));

// #2
Stream.of(strArray).forEach(System.out::println);

// #3
Arrays.stream(strArray).forEach(System.out::println);

/* output:
John
Mary
Bob
*/

70
2018-01-03 21:44



或者不那么累赘 Arrays.stream(strArray).forEach(System.out::println); - Alexis C.
这很笨拙。它应该是 System.out::println 这是一个Java 8方法参考。你的代码产生了一个不必要的lambda。 - Boris the Spider
快跳过 Arrays.asList 并做 Arrays.stream(strArray).forEach(System.out::println) - Justin
@AlexisC。因为它也可以与数组之外的其他对象一起使用。 - Yassin Hajaj
@YassinHajaj两个。例如,如果您希望在数组上使用惯用方式使用范围流 Stream.of 会这样做 .skip(n).limit(m)。当前实现不返回SIZED流而是 Arrays.stream(T[], int, int) 如果你想并行执行操作,会导致更好的分裂性能。如果你有一个 int[],你可能会不小心使用 Stream.of 这将返回一个 Stream<int[]> 用一个元素,而 Arrays.stream 会给你一个 IntStream 直。 - Alexis C.


如果您使用的是Java 1.4,则可以执行以下操作:

System.out.println(Arrays.asList(array));

(当然,这也适用于1.5+。)


37
2017-12-23 18:51



不幸的是,这仅适用于对象数组,而不适用于基元数组。 - Alex Spurling


从Java 8开始,人们也可以利用它 join() 方法提供的 字符串类 打印出没有括号的数组元素,并用选择的分隔符(下面显示的示例的空格字符)分隔:

String[] greeting = {"Hey", "there", "amigo!"};
String delimiter = " ";
String.join(delimiter, greeting) 

输出将是“嘿有amigo!”。


35
2017-10-05 19:13





Arrays.deepToString(arr) 只在一行打印。

int[][] table = new int[2][2];

要实际将表打印为二维表,我必须这样做:

System.out.println(Arrays.deepToString(table).replaceAll("],", "]," + System.getProperty("line.separator")));

好像是 Arrays.deepToString(arr) 方法应该采用分隔符字符串,但不幸的是它没有。


27
2018-03-11 05:36



也许使用System.getProperty(“line.separator”);而不是\ r \ n所以它也适用于非Windows。 - Scooter
你现在可以使用System.lineSeparator() - Novaterata