arrays.tostring()底层使用stringbuilder高效构建格式化字符串,先判空返回"null",再预估容量创建stringbuilder,依次append("[")、元素字符串和分隔符、最后append("]")并tostring。

要理解 Arrays.toString() 底层如何使用 StringBuilder,最直接的方式是查看 OpenJDK 源码(如 JDK 8 或 JDK 11+),并聚焦在该方法的实现逻辑上。它并不是简单拼接字符串,而是通过 StringBuilder 高效构建带格式的字符串表示(如 [a, b, c]),避免了字符串不可变带来的频繁对象创建开销。
定位 Arrays.toString 的核心实现
在 OpenJDK 源码中,Arrays.toString(Object[]) 方法位于 java.util.Arrays 类中。其关键逻辑是:
- 先检查数组是否为
null,是则返回"null"; - 否则创建一个初始容量合理的
StringBuilder(例如:预估长度 = 数组长度 × 4 + 2); - 用
append("[")开头,遍历元素,每个元素调用String.valueOf(obj)转为字符串,并用append(", ")分隔; - 最后
append("]")并返回toString()结果。
观察 StringBuilder 的实际使用方式
源码中不会出现 += 或多个 + 拼接,而是统一用 sb.append(...)。例如:
StringBuilder sb = new StringBuilder(16);<br>
sb.append('[');<br>
for (int i = 0; i
if (i > 0) sb.append(", ");<br>
sb.append(String.valueOf(a[i]));<br>
}<br>
sb.append(']');<br>
return sb.toString();
这种写法确保只创建一个 StringBuilder 对象,内部字符数组动态扩容,比用 "" + a[0] + ", " + a[1] 高效得多。
对比不同重载版本的共性
Arrays 提供了多种 toString 重载(如 int[]、double[]、Object[] 等)。它们的共同点是:
- 基本类型数组版本不调用
String.valueOf(),而是直接用对应包装类的静态方法(如Integer.toString())或内联转换; - 所有版本都使用
StringBuilder构建结果,而非字符串拼接; - 空数组返回
"[]",单元素数组返回"[x]",格式严格统一。
动手验证的小技巧
你可以这样加深理解:
- 下载 OpenJDK 源码(如从 github.com/openjdk/jdk),搜索
public static String toString; - 在 IDE 中 Ctrl+Click 进入
Arrays.toString,观察其调用链(例如deepToString会复用类似逻辑); - 写个简单测试,用 JMH 或日志打印
StringBuilder的capacity()和length()变化过程(需反射或调试模式观察)。











