java string字串拼接為什麼效能低,迴圈慢
阿新 • • 發佈:2019-02-14
字串迴圈+效能
@Test public void test() { long s1 = System.currentTimeMillis(); String str = ""; for (int i = 0; i < 10000; i++) { str += "asjdkla"; } long s2 = System.currentTimeMillis(); System.out.println(s2 - s1); }
jdk1.5之後編譯成
public void test3() { long s1 = System.currentTimeMillis(); String str = ""; for (int i = 0; i < 10000; i++) str = (new StringBuilder()).append(str).append("asjdkla").toString(); /** * 假設i=10了,str長度=70 * new char[16] * append(str)不夠 ,擴容 16*2+2<70存不下那麼新長度=70, new char[70] System.arraycopy src長度=16 * append("asjdkla")不夠,擴容 70*2+2=142能存下,new char[142] System.arraycopy src長度=70 * * 兩次append System.arraycopy src不斷增大 * tostring new char[142] System.arraycopy * * 共 5次System.arraycopy ,3次new char[] * 共8萬次,並且值逐漸變大 */ long s2 = System.currentTimeMillis(); System.out.println(s2 - s1); }
底層實現
-
new StringBuilder 是 new char[len] :預設是16, 效能與len長度正比關係
-
append
-
底層實現String類 -> getChars方法 -> System.arraycopy
-
-
擴容
-
規則 x2+2 如果還存不下,取能存下新字串和的長度
-
底層實現Arrays類->copyOf方法 -> new char[] + System.arraycopy
-
-
tostring
-
底層實現Arrays.copyOfRange -> new char[] + System.arraycopy
-
-
System.arraycopy 是native方法 ,效能與src長度成正比 。new char[len]效能與陣列大小成正比
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 程式碼解釋: Object src : 原陣列 int srcPos : 從元資料的起始位置開始 Object dest : 目標陣列 int destPos : 目標陣列的開始起始位置 int length : 要copy的陣列的長度