这是一个非常常见的问题,因为很多初学者会在这里遇到困惑。

直接对一个 Java 数组调用 toString() 方法,不会得到你期望的数组内容字符串(如 [1, 2, 3]),而是会得到一个包含数组“身份信息”的字符串,类似于 [I@1b6d3586 这样的格式。
为什么会这样?
这背后的原因在于 Java 的方法重载。
-
Object.toString()方法: 在 Java 中,所有类(包括数组)都默认继承自Object类。Object类中有一个toString()方法,它的作用是返回一个“文本表示”该对象的字符串,其默认实现通常是:getClass().getName() + '@' + Integer.toHexString(hashCode())
对于数组来说,
getClass().getName()会返回数组的类型描述符,
(图片来源网络,侵删)[I代表一个int数组。[Ljava.lang.String;代表一个String数组。[[D代表一个二维double数组。
-
数组没有重写
toString(): 数组本身(无论是int[]还是String[])并没有重写Object类中的toString()方法,当你对一个数组对象调用toString()时,你实际上调用的是Object类提供的默认实现,它只会打印出数组的类型和哈希码,而不是数组里的元素。
示例代码
让我们来看一个直观的例子:
public class ArrayToStringExample {
public static void main(String[] args) {
int[] primitiveArray = {1, 2, 3, 4, 5};
String[] objectArray = {"Apple", "Banana", "Cherry"};
// 直接调用数组的 toString() 方法
System.out.println("直接调用 int[] 的 toString():");
System.out.println(primitiveArray.toString()); // 输出类似: [I@1b6d3586
System.out.println("\n直接调用 String[] 的 toString():");
System.out.println(objectArray.toString()); // 输出类似: [Ljava.lang.String;@4554617c
}
}
输出结果(哈希码可能不同):
直接调用 int[] 的 toString():
[I@1b6d3586
直接调用 String[] 的 toString():
[Ljava.lang.String;@4554617c
正如你所见,这并不是我们想要的格式。

正确的解决方案
有几种正确的方法可以将数组转换为包含其元素的字符串。
使用 Arrays.toString() (最推荐)
这是最简单、最直接的方法。java.util.Arrays 类提供了一个重载的 toString() 方法,专门用于处理各种类型的数组。
如何工作:
Arrays.toString() 方法会遍历数组中的每一个元素,并调用该元素的 toString() 方法(如果元素是对象),然后将所有元素用逗号和空格连接起来,并用方括号 [] 括起来。
示例代码:
import java.util.Arrays;
public class CorrectArrayToString {
public static void main(String[] args) {
int[] primitiveArray = {1, 2, 3, 4, 5};
String[] objectArray = {"Apple", "Banana", "Cherry"};
// 使用 Arrays.toString()
System.out.println("使用 Arrays.toString(int[]):");
System.out.println(Arrays.toString(primitiveArray)); // 输出: [1, 2, 3, 4, 5]
System.out.println("\n使用 Arrays.toString(String[]):");
System.out.println(Arrays.toString(objectArray)); // 输出: [Apple, Banana, Cherry]
}
}
输出结果:
使用 Arrays.toString(int[]):
[1, 2, 3, 4, 5]
使用 Arrays.toString(String[]):
[Apple, Banana, Cherry]
手动循环拼接
如果你不想使用 java.util.Arrays 工具类,可以自己通过循环来构建字符串。
示例代码:
public class ManualArrayToString {
public static void main(String[] args) {
int[] numbers = {10, 20, 30};
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < numbers.length; i++) {
sb.append(numbers[i]);
// 如果不是最后一个元素,则添加逗号和空格
if (i < numbers.length - 1) {
sb.append(", ");
}
}
sb.append("]");
System.out.println(sb.toString()); // 输出: [10, 20, 30]
}
}
这种方法更灵活,但代码量也更多,容易出错(比如忘记处理最后一个元素的逗号),通常不推荐在简单场景下使用。
处理多维数组 (Arrays.deepToString())
对于二维数组或更高维的数组,Arrays.toString() 只会打印出第一层元素的引用,而不是它们的实际内容。
示例代码:
import java.util.Arrays;
public class MultiDimensionalArrayToString {
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 使用 Arrays.toString() 处理二维数组
System.out.println("使用 Arrays.toString(int[][]):");
System.out.println(Arrays.toString(matrix));
// 输出: [[I@1b6d3586, [I@4554617c, [I@74a14482] (这不是我们想要的)
System.out.println("\n使用 Arrays.deepToString(int[][]):");
// 使用 Arrays.deepToString() 递归地打印所有层级的元素
System.out.println(Arrays.deepToString(matrix));
// 输出: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
}
}
- 一维数组:使用
Arrays.toString()。 - 二维及以上数组:使用
Arrays.deepToString()。
总结表格
| 方法 | 适用场景 | 示例 | 输出 |
|---|---|---|---|
array.toString() |
错误用法,不推荐 | int[] a = {1,2}; a.toString(); |
[I@1b6d3586 |
Arrays.toString(array) |
一维数组(基本类型或对象类型) | Arrays.toString(new int[]{1,2}); |
[1, 2] |
Arrays.deepToString(array) |
二维或更高维数组 | Arrays.deepToString(new int[][]{{1},{2}}); |
[[1], [2]] |
| 手动循环拼接 | 特殊需求,需要自定义格式 | (见上文示例) | [10, 20, 30] |
记住这个核心要点:
要打印数组的内容,请使用
java.util.Arrays.toString()方法,而不是直接调用数组对象的toString()。
