StringBuild与StringBuffer的区别

线程安全

StringBuffer

public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

StringBuild

public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

区别:

  • 在StringBuffer中append追加字符方法有同步代码块synchronize修饰,保证线程同步
  • StringBuild中就没有同步代码块,无法保证线程安全

缓冲区

StringBuffer

/**
     * A cache of the last value returned by toString. Cleared
     * whenever the StringBuffer is modified.
     * toString返回的最后一个值的缓存。 每当修改StringBuffer时清除。
     */
private transient String toStringCache;
public synchronized String toString() {
        if (toStringCache == null) {
            return toStringCache =
                    isLatin1() ? StringLatin1.newString(value, 0, count)
                               : StringUTF16.newString(value, 0, count);
        }
        return new String(toStringCache);
    }

StringBuild

public String toString() {
        // Create a copy, don't share the array
    	// 复制一个数组,但是不分享这个数组
        return isLatin1() ? StringLatin1.newString(value, 0, count)
                          : StringUTF16.newString(value, 0, count);
    }
  • 从上面代码看出,StringBuf每次对字符串进行操作时候有一个临时变量,每次操作都拿着个Cache临时变量操作
  • 每次做新的操作时候都清除这个缓存
  • 而StringBuild每次操作都是new一个数组,但不分享这个数组,再对这个数组进行操作,没有缓冲区

速度/效率

  • 因为StringBuffer使用同步代码块技术,导致运行效率比不使用同步技术的StringBuild低,而且StringBuild也没有缓冲区,效率高
上一篇 下一篇