44
回答
JDK源码浏览:一个有趣的格式化数组为字符串的方式
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

在浏览Java源码的过程中,我发现一个有趣的片段,想拿来给大家分享。这部分代码格式化一个整型数组为字符串,我觉得其中for循环的写法很不常见。我写了一个类似的方法作为对比,在这里我会把两个版本都贴出来。

问题

我们必须返回指定数组内容的字符串表示形式。这个字符串由数组的元素组成,两端为方括号(“[]”),相邻的元素之间用”, “(一个逗号和一个空格)分隔。通过String.valueOf(char)方法把每个元素转换成字符串,如果数组为null,返回”null”。

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

方法将返回:[1, 2, 3, 4, 5, 6, 7, 8, 9]

JDK版本

注意第13行的for循环没有结束检查。用来格式化数组尾部的代码也很有趣(第15行)。

    //
    // The following code is from JDK - java.util.Arrays.toString()
    //
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(", ");
    }
}

我的版本

public static String toStringMyVersion(int[] a) {
    if (a == null) {
        return "null";
    }
     
    if (a.length == 0) {
        return "[]";
    }
     
    StringBuffer sb = new StringBuffer("[");
     
    int size = a.length;
    for (int x=0; x < size-1; x++) {
        sb.append(a[x]).append(", ");
    }
     
    sb.append(a[size-1]).append("]");
     
    return sb.toString();
}

原文链接/Oschina.NET编译

JDK
举报
tsl0922
发帖于6年前 44回/5K+阅

以下是话题补充:

  • @tsl0922 :哎,躺着也中枪。 文章是翻译来的,那个我的版本是原文作者的版本。 我错了,没特别说明~ (6年前)
共有44个评论 最后回答: 5年前
JDK的版本每一次循环都进行了一次if语句的比较...效率不太可能会更高
--- 共有 8 条评论 ---
羅立安的眼光其实把条件写在for里还不是每次都去判断吗 6年前 回复
花谢花开回复 @loyal : +1; 6年前 回复
ExtremeTalk-1 6年前 回复
山哥回复 @xinzaibing : 循环中增加 if 条件判断,性能影响几乎可以忽略的吧 6年前 回复
xinzaibing回复 @loyal : 我不是搞JAVA开发的...对JAVA优化方面不太清楚。但是在C++里能在for循环条件进行判断的一般不会在循环内部判断...稍微有点影响的 6年前 回复

这类情况在JDK源码中很常见,应该不是什么效率问题,编码习惯的可能性更大,因为JDK的编写者原来都是其它语言转过来的,在他们那个时代准寻这样的写法也说不定。

“if (i == iMax)” 重复被使用了 循环结束和append(']')的条件是一样的 这样写少了一次判断 效率会高一点
习惯问题而已,jdk源码有很多地方都不太标准的,这些都是刚开始的时候还没什么规范,Color这个类里静态变量都是小写都有,后来又用大写重新写了一次。
--- 共有 4 条评论 ---
Monkey回复 @WenLuo : 那个时候还没规范呢 6年前 回复
vaenow回复 @jinceon : 原来是他们初期时不规范... 6年前 回复
Monkey回复 @jinceon : 还有那种没有使用的import多如牛毛,到处都是。 6年前 回复
jinceon刚开始我也觉得奇怪,为什么还要定义大小写两种。 6年前 回复
顶部