String,StringBuilder和StringBuffer類

今天看了一下子關於String的一類的書,大概瞭解了String,StringBuilder和Stringuffer的區別。下面我就來淺談一下關於這三部分的差異。安全

public class Test {

        int loopCount = 10000; // 執行添加操做10000次

        public static void main(String[] args) {
            Test test = new Test();
            test.testString();
            test.testStringBuffer();
            test.testStringBuilder();
        }

        private void testString() {
            long startTime = System.nanoTime();// 得到當前系統最準確的計時器,以毫微秒爲計時單位
            String temp = "";
            for (int i = 0; i < loopCount; i++) {
                temp += i;
            }
            long endTime = System.nanoTime();
            System.out.println("String運行時間: " + (endTime - startTime));
        }

        private void testStringBuffer() {
            long startTime = System.nanoTime();// 得到當前系統最準確的計時器,以毫微秒爲計時單位
            StringBuffer temp = new StringBuffer("");
            for (int i = 0; i < loopCount; i++) {
                temp.append(i);
            }
            long endTime = System.nanoTime();
            System.out.println("StringBuffer運行時間: " + (endTime - startTime));
        }

        private void testStringBuilder() {
            long startTime = System.nanoTime();// 得到當前系統最準確的計時器,以毫微秒爲計時單位
            StringBuilder temp = new StringBuilder("");
            for (int i = 0; i < loopCount; i++) {
                temp.append(i);
            }
            long endTime = System.nanoTime();
            System.out.println("StringBuilder運行時間: " + (endTime - startTime));
        }
}

首先,運行這三個String差異,能夠看出時間上差別很大app

String運行時間: 606270951
StringBuffer運行時間: 1167296
StringBuilder運行時間: 746880

Process finished with exit code 0

ide

String作字符串的拼接中函數

  String是一個不可變的線程安全的一個函數,關於字符串拼接,其調用oop

/** The value is used for character storage. */
private final char value[];

因爲final是一個不可變的,因此每一次的調用,都須要建立一個新的對象。
ui

String new=「this」+「is」+「a day「;this

這樣的拼接方式,編譯器直接給你拼接爲this is a day 實際上就是調用了Stringbuffer直接拼接而成,因此時間和StringBuffer其實差很少。可是若是是String str1="this",String str2="is";String str3="a day";String str=str1+str2+str3;這種形式的話,就是真實的按照String拼接。String的拼接,因爲使用final做爲不可變參數,因此線程安全。線程

而StringBuffer,因爲須要字符串的拼接,因此有一些獨特的用於拼接字符串的方法。code

@Override
public synchronized StringBuffer append(Object obj) {
    toStringCache = null;
    super.append(String.valueOf(obj));
    return this;
}

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

/**
 * @throws StringIndexOutOfBoundsException {@inheritDoc}
 * @since      1.2
 */
@Override
public synchronized StringBuffer delete(int start, int end) {
    toStringCache = null;
    super.delete(start, end);
    return this;
}

這些方法,是用來作字符串拼接有關,咱們能夠見到synchronized,其中全部的方法都給加了鎖,因此這個方法也是線程安全的。對象

   

private transient char[] toStringCache;

關於字符串拼接,因爲不是不可變的,因此速度會快。

另外一個的話,和StringBuffer差很少,可是線程不安全。

關於StringBuffer和StringBuilder他們共同繼承了

AbstractStringBuilder

和序列化


public AbstractStringBuilder append(char[] str) {
    int len = str.length;
    ensureCapacityInternal(count + len);
    System.arraycopy(str, 0, value, count, len);
    count += len;
    return this;
}

這一部分是字符串拼接部分

相關文章
相關標籤/搜索