1. 程式人生 > >java string字串拼接為什麼效能低,迴圈慢

java string字串拼接為什麼效能低,迴圈慢

字串迴圈+效能

    @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);
}

底層實現

  1. new StringBuilder 是 new char[len] :預設是16, 效能與len長度正比關係

  2. append

    1. 底層實現String類 -> getChars方法 -> System.arraycopy

  3. 擴容

    1. 規則 x2+2 如果還存不下,取能存下新字串和的長度

    2. 底層實現Arrays類->copyOf方法 -> new char[] + System.arraycopy

  4. tostring

    1. 底層實現Arrays.copyOfRange -> new char[] + System.arraycopy

  5. 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的陣列的長度