java.lang.StringBuffer VS java.lang.StringBuilder

java.lang.StringBuffer:  thread-safe(之所以是thread-safe的是因为它的所有方法(构造函数除外)都是synchronized的)
java.lang.StringBuilder: not thread-safe, much faster than StringBuffer since no synchronization.
StringBuilder was introduced since JDK1.5 and it provides the same operation as StringBuffer.


AbstractStringBuilder里有个乍看很巧妙细看很愚蠢再仔细推敲很高明的函数 static int stringSizeOfInt(int x) ,该函数返回整形数字x的长度,比如x=5,返回长度1,x=10,返回2,x=999.返回3.请看实现:
    final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
                                     99999999, 999999999, Integer.MAX_VALUE };

    // Requires positive x
    static int stringSizeOfInt(int x) {
        for (int i=0; ; i++)
            if (x <= sizeTable[i])
                return i+1;
    }

    // Requires positive x
    static int stringSizeOfLong(long x) {
        long p = 10;
        for (int i=1; i<19; i++) {
            if (x < p)
                return i;
            p = 10*p;
        }
        return 19;
    }

为啥不直接用String.valueOf(x).length()呢?(负数的时候,-1即可啊) 猜想:应该是这种算法的效率更高?(看String.valueOf()的实现吧)。
BTW:可以看到JDK的代码里,存在一些看着不是那么优雅和简洁明了的代码,根据这个猜想,有些时候为了获得性能方面的提升,丑陋的代码还是需要的,呵呵。

令一个很好的算法同样位于AbstractStringBuilder,reverse()函数,实现如下(下例去除掉关于utf-16 surrogate的考虑)
    public AbstractStringBuilder reverse() {
    int n = count - 1;
    for (int j = (n-1) >> 1; j >= 0; --j) {
        char temp = value[j];
        char temp2 = value[n - j];
        value[j] = temp2;
        value[n - j] = temp;
    }
    return this;
    }
由此可以引伸出reverse(char[]) or reverse(String)等等。。。

注意AbstractStringBuilder虽然是一个abstract,但是只有一个方法是abstract的,就是String toString(). 而StringBuffer和StringBuilder都是exteds AbstractStringBuilder,它俩各个方法的重载基本上都是调用了super.xxxx ,唯一不同的是synchronization以及返回值的不同.
至于String和这俩的区别,没啥好说的,google一大把

你可能感兴趣的:(java,thread,Google,J#)