1

我阅读了 JDK 的源代码,并对代码的措辞感到困惑。代码的方法意味着返回指定数组内容的字符串表示。

例如:int[] a = { 0,1, 2, 3, 4, 5, 6, 7, 8, 9 };
返回 : [1, 2, 3, 4, 5, 6, 7, 8, 9]

JDK 版本

 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(", ");
    }
}

我的问题:
1,为什么不把 if 条件放在 for 循环
代码的外面:

 //the follow code efficiency may be better or not
 for (int i = 0; i< iMax; i++) {
        b.append(a[i]);
        b.append(", ");
    }
 return  b.append(a[iMax]).append(']').toString();

2、StringBuilder方法 append ,如果参数是括号,方法使用char参数而不是String,我深入 append方法,append(char c)方法看起来效率很高,但我不确定

谢谢

4

4 回答 4

2

我认为您的代码可以像这样进一步优化/重构:

public static String toString(int[] a) {
    if (a == null)
        return "null";
    StringBuilder b = new StringBuilder("[");
    int iMax = a.length - 1;
    if (iMax == -1)
         return b.append(']').toString();;
    for (int i = 0; i < iMax; i++)
        b.append(a[i]).append(", ");
    return b.append(a[iMax]).append(']').toString();
}
于 2012-05-17T09:45:03.680 回答
0
  1. 您必须在“for”循环中编写“if”条件,因为“for”循环的结构是:

      for(initialization, test condition, modifier expression)
    
     eg: for(int i=0 ; i<10 ; i++)
    

    如上面的例子 for (int i = 0; ; i++) 没有测试条件,它必须写在“for”循环中,否则它将继续迭代......即。无限循环。

  2. 这里方法 public static String toString(int[] a) 的返回类型为 String,因此使用 toString() 更容易将其转换为字符串格式,现在如果它是“char”,则首先将其转换为Wrapper 对象“Character”,然后我们可以将 toString() 应用于它......它很乏味......但可以做到......

于 2012-05-17T10:03:06.557 回答
0
  1. 您的代码通过<(小于) 来比较数字,它永远不会比等式比较 ( ==) 执行得更好,并且可能执行得更差。所以JDK版本更加精心优化和深思熟虑。

  2. 是的,在适用的情况下使用原始 arg 会更有效。没有堆分配,没有指针取消引用(避免可能的缓存未命中和页面错误)。

于 2012-05-17T09:31:43.957 回答
-1

1.) 如果将 if 条件放在循环之后,它将在退出循环之前在字符串的末尾添加一个逗号。导致“[1, 2, 3, 4, 5, 6, 7, 8, 9,]”。请注意 9 之后的最后一个逗号。这是完成工作的最简单方法。

2.) 当您不想在字符串池中放入大量不会被清除的字符串时,使用 StringBuilder。但诚实的答案是我不确定!

于 2012-05-17T10:36:01.937 回答