导读:本期聚焦于小伙伴创作的《Java中Arrays.toString()为什么能打印对象内容而非哈希码》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java中Arrays.toString()为什么能打印对象内容而非哈希码》有用,将其分享出去将是对创作者最好的鼓励。

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

Java中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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。