StringBuilder的append方法和String+String的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StringBuilder的append方法和String+String的区别相关的知识,希望对你有一定的参考价值。

StringBuilder和StringBuffer,字符串是存放在char[]中的,char[]是存放在堆中的。
相比String每次+都重新创建一个String对象,重新开辟一段内存不同,StringBuilder和StringBuffer的append都是直接把String对象中的char[]的字符直接拷贝到StringBuilder和StringBuffer的char[]上,效率比String的+高得多。当然,当StringBuilder和StringBuffer的char[]长度不够时,也会重新开辟一段内存。

另外,StringBuffer是线程安全的,StringBuilder不是线程安全的。
参考技术A StringBuilder和StringBuffer,字符串是存放在char[]中的,char[]是存放在堆中的。
相比String每次+都重新创建一个String对象,重新开辟一段内存不同,StringBuilder和StringBuffer的append都是直接把String对象中的char[]的字符直接拷贝到StringBuilder和StringBuffer的char[]上,效率比String的+高得多。当然,当StringBuilder和StringBuffer的char[]长度不够时,也会重新开辟一段内存。

另外,StringBuffer是线程安全的,StringBuilder不是线程安全的。本回答被提问者和网友采纳

读阿里规约有感循环体内的字符串连接时,使用StringBuilder的append()和+String的方式比较

阿里规约里原话是:

【推荐】循环体内,字符串的连接方式,请使用 StringBuilder 的 append 方法进行扩展。(而不要用+String的方式)
说明:因为反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行
append 操作,最后通过 toString 方法返回 String 对象,造成内存资源浪费。

从这句话得知,用StringBuilder连接字符串比 + 的方式好,因为更少占用内存资源。可是我们怎么才能更加直观的看到性能对比呢?

这时我想到了时间开销对比,我推测前者的运行时间比后者少,于是有了下面的测试代码

@Test
public void mainTest1()
long startTime1 = System.currentTimeMillis();
StringBuilder str1 = new StringBuilder("start");
for (int i = 0;i < 100000; i++)
str1.append(i);

long endTime1 = System.currentTimeMillis();
long time1 = endTime1 - startTime1;
System.out.println("StringBuilder所花时间:" + time1);
String str2 = "start";
long startTime2 = System.currentTimeMillis();
for (int i = 0;i < 100000; i++)
str2 = str2 + i;

long endTime2 = System.currentTimeMillis();
long time2 = endTime2 - startTime2;
System.out.println("String++所花时间:" + time2);


------------------------------------------------------

SringBuilder所花时间:8
Sring++所花时间:11866

----------------------------------------------------------------------------------------------------------

显而易见。

 

以上是关于StringBuilder的append方法和String+String的区别的主要内容,如果未能解决你的问题,请参考以下文章

求教,Java的StringBuilder里的append()方法要怎么用?括号里面要怎么填eclipse才不出现错误

读阿里规约有感循环体内的字符串连接时,使用StringBuilder的append()和+String的方式比较

StringBuilder类中的重要方法

什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?

java-API之StringBuilder类型

StringBuilder append()添加末端字符 reverse()字符相反