您的位置:首页 > Web前端

StringBuffer和String速度

2018-01-19 11:45 549 查看
在公司看到了一段代码:
StringBuilder logStr = new StringBuilder("merID=")
.append(accountReqBean.getMerId()).append(",merDate=")
.append(accountReqBean.getMerDate()).append(",merOrdId=")
.append(accountReqBean.getMerOrdId()).append(",orgId=")
.append(accountReqBean.getOrgId()).append(",orgUserId=")
.append(accountReqBean.getOrgUserId()).append(",transType=")
.append(accountReqBean.getTransType()).append(",transSubType=")
.append(accountReqBean.getTransSubType()).append(",keepAmt=")
.append(accountReqBean.getKeepAmt()).append(";"); 我们都知道StringBuffer在字符串拼接上是比String要快的。但是这种形式的append,我感觉应该是不会加快多少速度的,因为这种形式的拼接,理论上来上说,是和new String效率是一样的。
举例来说:
String s=new String("1"+"2") 和
StringBuffer s=new StringBuffer().append("1").append("2");
速度应该是一样的,因为他可能是直接把拼接当作了new String(“12”)这种形式申明。
所以今天做个测试:上代码
public static void main(String[] args) {
Long saveTime=System.currentTimeMillis();
String testString = "";
for (int i = 0; i < 999; i++) {
testString=testString+"添加文本ABCD";
}
System.out.println("String所用时间:"+(System.currentTimeMillis()-saveTime));

saveTime=System.currentTimeMillis();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 999; i++) {
buffer=buffer.append("添加文本ABCD");
}
System.err.println("StringBuffer所用时间:"+(System.currentTimeMillis()-saveTime));

saveTime=System.currentTimeMillis();
testString = "添加文本ABCD"+"添加文本ABCD"+"添加文本ABCD"+"添加文本ABCD"+"添加文本ABCD"+"添加文本ABCD"+"添加文本ABCD"+"添加文本ABCD"+"添加文本ABCD"+"添加文本ABCD"+"添加文本ABCD";//博客上版面原因,省略后面的900多次拼接,实际上是很长的,我代码拼接的

System.out.println("String单行拼接:"+(System.currentTimeMillis()-saveTime));

saveTime=System.currentTimeMillis();
buffer = new StringBuffer().append("添加文本ABCD").append("添加文本ABCD").append("添加文本ABCD").append("添加文本ABCD");//博客上版面原因,省略后面的900多次拼接,实际上是很长的,我代码拼接的
System.err.println("StringBuffer单行拼接:"+(System.currentTimeMillis()-saveTime));
}结果是:
String所用时间:12
StringBuffer所用时间:0
String单行拼接:0
StringBuffer单行拼接:0
so,结果如我所想。
单行拼接。String和StringBuffer速度上是一样的。
关于为什么String 和StringBuffer 循环拼接速度不一致是因为String 用+拼接的时候,是在不断地新创建一个String空间去保存新+的字符串,也就是每次+后的新字符串实际上和以前那个字符串在虚拟机角度不是一个空间的,这样不断申请新的空间,肯定会比较慢,而且会耗。但是StringBuffer的Buffer是缓冲区的意思,也就是说可以理解为将String放入一个缓冲区或者一个可变的空间中,在这个区域内不断appedn改变字符串不用新申请空间。等你确定好了,直接toString输出就好了。这就是为什么速度会有区别
而StringBuffer 和StringBuilder的区别是builder是线程不安全的,Buffer线程安全。而为了线程安全,StringBuffer速度回避StringBuilder 慢上一些
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: