为什么StringBuilder比String快得多

Jas*_*son 3 java string stringbuilder

我知道这里发布了很多类似的问题,但这些问题并没有真正回答我的问题.

我只是想知道为什么StringBuilder比使用+运算符的字符串连接快得多.即使+操作员内部是使用StringBuffer或者StringBuilder

public void shortConcatenation(){
    long startTime = System.currentTimeMillis();
    while (System.currentTimeMillis()-startTime<=1000){


        character+="Y";

    }

    System.out.println("short :"+character.length());
}
Run Code Online (Sandbox Code Playgroud)

////使用String builder

 public void shortConcatenation2(){
    long startTime = System.currentTimeMillis();
    StringBuilder sb = new StringBuilder();
    while (System.currentTimeMillis()-startTime<=1000){

        sb.append("Y");
    }
    System.out.println("string builder short :"+sb.length());
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Mar*_*rno 12

你了解它的内部工作原理吗?

每次执行stringA += stringB;新字符串时都会创建一个指定给stringA的字符串,因此它将消耗内存(新字符串实例!)和时间(复制旧字符串+另一个字符串的新字符).

StringBuilder将在内部使用一个字符数组,当你使用.append()方法时,它会做几件事:

  • 检查是否有任何可用空间供要追加的字符串
  • 再次进行一些内部检查并运行a System.arraycopy来复制数组中字符串的字符.

就个人而言,我认为每次分配一个新的字符串(创建一个新的字符串实例,放置字符串等)在内存和速度方面可能非常广泛(特别是在/同时等等).

在你的例子中,使用a StringBuilder更好但是​​如果你需要(例子)简单的东西,比如a.toString()

public String toString() {
    return StringA + " - " + StringB;
}
Run Code Online (Sandbox Code Playgroud)

没有区别(好吧,在这种情况下,你最好避免使用StringBuilder开销,这在这里没用).


小智 9

java中的字符串是不可变的.这意味着对字符串进行操作的方法不能更改字符串的值.使用+ =进行字符串连接的工作原理是为一个全新的字符串分配内存,该字符串是前两个字符串的串联,并用这个新字符串替换引用.每个新的连接都需要构造一个全新的String对象.

相反,StringBuilder和StringBuffer类被实现为可变的字符序列.这意味着当您将新的字符串或字符追加到StringBuilder时,它只是更新其内部数组以反映您所做的更改.这意味着只有当字符串超过StringBuilder中已存在的缓冲区时才会分配新内存.