在Java编程中,当我们直接打印一个普通对象时,默认会输出类似java.lang.Object@1b6d3586的哈希码形式,这是因为Object类的默认toString()方法会拼接类名和哈希值。但使用Arrays.toString()方法处理数组时,却能直接输出数组内的具体元素内容,这一特性背后有着明确的实现逻辑。

普通对象打印与Arrays.toString()的差异
普通对象的打印逻辑由Object类的toString()方法决定,其默认实现如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
而Arrays.toString()是java.util.Arrays工具类提供的静态方法,专门针对数组类型做了适配,不会调用数组对象的默认toString()逻辑。数组本身没有重写toString()方法,所以直接打印数组才会输出哈希码,而通过Arrays工具类的方法就能得到元素内容。
Arrays.toString()的实现原理
Arrays类针对不同类型的数组提供了重载的toString()方法,以最常用的一维对象数组为例,其实现逻辑如下:
public static String toString(Object[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(String.valueOf(a[i]));
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
从代码可以看出,该方法首先判断数组是否为null,然后遍历数组的每个元素,调用String.valueOf()处理每个元素:如果元素为null,返回"null";如果元素不为null,会调用元素自身的toString()方法转换为字符串,最后拼接成[元素1, 元素2, ...]的格式返回。
基本类型数组的处理
对于int、char、double等基本类型的数组,Arrays也提供了对应的重载方法,比如int数组的实现:
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
基本类型数组的方法会直接拼接基本类型的值,不需要调用toString()方法,避免了空指针问题。
自定义对象数组的使用注意事项
当使用Arrays.toString()打印自定义对象数组时,输出的内容取决于自定义对象是否重写了toString()方法:
- 如果自定义对象没有重写toString(),那么每个元素会调用Object类的默认toString(),输出哈希码形式
- 如果自定义对象重写了toString(),则会输出重写后的内容
示例如下:
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 重写toString方法
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
}
public class Test {
public static void main(String[] args) {
User[] users = {new User("张三", 20), new User("李四", 22)};
// 输出:[User{name='张三', age=20}, User{name='李四', age=22}]
System.out.println(Arrays.toString(users));
}
}
多维数组的处理
如果是多维数组,需要使用Arrays.deepToString()方法,否则只会打印出内层数组的哈希码。Arrays.deepToString()会递归处理数组的每一层,确保所有元素都能被正确转换为字符串。
示例:
public class Test {
public static void main(String[] args) {
int[][] arr = {{1, 2}, {3, 4}};
// 输出:[[1, 2], [3, 4]]
System.out.println(Arrays.deepToString(arr));
// 直接调用Arrays.toString()输出:[[I@1b6d3586, [I@4554617c]
System.out.println(Arrays.toString(arr));
}
}
总结
Arrays.toString()能够打印数组内容而非哈希码,本质是Arrays工具类针对数组类型做了专门的方法重载,通过遍历数组元素并调用元素的字符串转换逻辑,最终拼接出可读的内容。使用时需要注意数组类型,基本类型数组用对应重载方法,对象数组注意对象自身的toString()实现,多维数组则要用deepToString()方法,才能符合预期的输出效果。
JavaArrays.toString对象打印哈希码数组工具类修改时间:2026-07-18 09:57:24