使用示例

  1. public class Test {
  2. public static void main(String[] args) {
  3. // 打印:[3, 1, 2, 5, 4, 6, 5, 9]
  4. System.out.println(Arrays.toString(new int[] {3, 1, 2, 5, 4, 6, 5, 9}));
  5. // 打印:[[1, 2], [3], [3, 2, 5, 8]]
  6. System.out.println(Arrays.deepToString(new int[][] {{1, 2}, {3, 4}, {3, 2}}));
  7. }
  8. }

Arrays.toString方法源码分析

  1. /**
  2. * Arrays.toString方法源码(以整型数组来分析,其他同理)
  3. */
  4. public static String toString(int[] a) {
  5. if (a == null)
  6. return "null";
  7. int iMax = a.length - 1;
  8. if (iMax == -1)
  9. return "[]";
  10. StringBuilder b = new StringBuilder();
  11. b.append('[');
  12. for (int i = 0; ; i++) {
  13. b.append(a[i]);
  14. if (i == iMax)
  15. return b.append(']').toString();
  16. b.append(", ");
  17. }
  18. }
  • 可以看出,Arrays.toString方法实现非常简单:
    • 构造一个StringBuilder对象
    • 对数组进行循环,并拼接数组中的元素到StringBuilder对象中
    • 返回组装成功的字符串

Arrays.deepToString方法源码分析

  1. /**
  2. * Arrays.deepToString方法源码
  3. */
  4. public static String deepToString(Object[] a) {
  5. if (a == null)
  6. return "null";
  7. int bufLen = 20 * a.length;
  8. if (a.length != 0 && bufLen <= 0)
  9. bufLen = Integer.MAX_VALUE;
  10. StringBuilder buf = new StringBuilder(bufLen);
  11. deepToString(a, buf, new HashSet<Object[]>());
  12. return buf.toString();
  13. }
  14. private static void deepToString(Object[] a, StringBuilder buf,
  15. Set<Object[]> dejaVu) {
  16. if (a == null) {
  17. buf.append("null");
  18. return;
  19. }
  20. int iMax = a.length - 1;
  21. if (iMax == -1) {
  22. buf.append("[]");
  23. return;
  24. }
  25. dejaVu.add(a);
  26. buf.append('[');
  27. for (int i = 0; ; i++) {
  28. Object element = a[i];
  29. if (element == null) {
  30. buf.append("null");
  31. } else {
  32. Class<?> eClass = element.getClass();
  33. if (eClass.isArray()) {
  34. if (eClass == byte[].class)
  35. buf.append(toString((byte[]) element));
  36. else if (eClass == short[].class)
  37. buf.append(toString((short[]) element));
  38. else if (eClass == int[].class)
  39. buf.append(toString((int[]) element));
  40. else if (eClass == long[].class)
  41. buf.append(toString((long[]) element));
  42. else if (eClass == char[].class)
  43. buf.append(toString((char[]) element));
  44. else if (eClass == float[].class)
  45. buf.append(toString((float[]) element));
  46. else if (eClass == double[].class)
  47. buf.append(toString((double[]) element));
  48. else if (eClass == boolean[].class)
  49. buf.append(toString((boolean[]) element));
  50. else { // element is an array of object references
  51. if (dejaVu.contains(element))
  52. buf.append("[...]");
  53. else
  54. deepToString((Object[])element, buf, dejaVu);
  55. }
  56. } else { // element is non-null and not an array
  57. buf.append(element.toString());
  58. }
  59. }
  60. if (i == iMax)
  61. break;
  62. buf.append(", ");
  63. }
  64. buf.append(']');
  65. dejaVu.remove(a);
  66. }
  • 可以看出,Arrays.deepToString方法会稍微复杂一点点:
    • 同样也是构造一个StringBuilder对象
    • 然后遍历一维数组中的每个元素
      • 判断每个是否为数组(不是数组则直接记录对象的toString字符串描述)
      • 否则,校验元素数组的对象类型
        • 若为基本类型数据,则直接调用toString方法,并记录其结果
        • 否则,再嵌套调用deepToString方法
    • 返回拼接成功后的字符串