杰瑞科技汇

Java数组为何直接调用toString()输出的是地址?

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

Java数组为何直接调用toString()输出的是地址?-图1
(图片来源网络,侵删)

直接对一个 Java 数组调用 toString() 方法,不会得到你期望的数组内容字符串(如 [1, 2, 3],而是会得到一个包含数组“身份信息”的字符串,类似于 [I@1b6d3586 这样的格式。


为什么会这样?

这背后的原因在于 Java 的方法重载。

  1. Object.toString() 方法: 在 Java 中,所有类(包括数组)都默认继承自 Object 类。Object 类中有一个 toString() 方法,它的作用是返回一个“文本表示”该对象的字符串,其默认实现通常是:

    getClass().getName() + '@' + Integer.toHexString(hashCode())

    对于数组来说,getClass().getName() 会返回数组的类型描述符,

    Java数组为何直接调用toString()输出的是地址?-图2
    (图片来源网络,侵删)
    • [I 代表一个 int 数组。
    • [Ljava.lang.String; 代表一个 String 数组。
    • [[D 代表一个二维 double 数组。
  2. 数组没有重写 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

正如你所见,这并不是我们想要的格式。

Java数组为何直接调用toString()输出的是地址?-图3
(图片来源网络,侵删)

正确的解决方案

有几种正确的方法可以将数组转换为包含其元素的字符串。

使用 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()

分享:
扫描分享到社交APP
上一篇
下一篇