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的数组的长度

 

你可能感兴趣的:(java后台)