String a=String b + String c + String d

这种代码在程序里应该随处可见,一部分人不知道这段代码的缺陷在哪,另一部分人知道这样写不好,但是太顺手了下意识就写了。

在Java里,String是个不可变对象,所以右边的每次赋值操作都会new一个新对象,b+c,b+c+d,至少会new两个,很明显性能不佳。但是这个问题没有大多数情况下没我们想象的那么严重,因为编译器在编译时会对String做很多优化,但是对于一些运行时的赋值和修改操作,编译器很难优化,这种时候,就强烈不推荐这样写,虽然写的很顺手 ,但是性能不行,如果存在字符串的修改操作,就应该用StringBuilder和StringBuffer。

下面,就用一个简单的测试,来看看他们之间的性能差别,让我们心里有数。

1. 测试String直接拼接

     public static void main(String[] args) {
long begin = System.currentTimeMillis();
String str = "";
for(int i=0;i<10000;i++){
str = str+i;
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println(time+"");
}

直接用String的拼接,循环调用10000次,跑出来结果是639毫秒

2.测试String.concat拼接

     public static void main(String[] args) {
long begin = System.currentTimeMillis();
String str = "";
for(int i=0;i<10000;i++){
str = str.concat(String.valueOf(i));
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println(time+"");
}

也是循环调用10000次,跑出来结果是322毫秒

3.测试StringBuilder拼接

     public static void main(String[] args) {
long begin = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for(int i=0;i<10000;i++){
sb.append(i);
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println(time+"");
} }

同样循环调用10000次,结果是5毫秒。换成StringBuffer,结果也是一样。

上面这个简单测试,可以用数据告诉我们,String和StringBuilder、StringBuffer之间的性能差距了,所以如果字符串有变更,都用StringBuilder和StringBuffer,而不是用简单粗暴的赋值操作,另外就是,上面可以看出,String的concat性能也明显优于直接拼接。

关于StringBuilder和StringBuffer

这两个操作可变字符串的类,都实现了AbstractStringBuilder抽象类,接口也几乎一样,他的最大区别是:StringBuffer基本所有方法都做了同步,而StringBuilder没有,换言之,StringBuffer是线程安全的,StringBuilder不是。所以这两个就根据不同的场景做取舍就ok。

谢谢@assiwe提醒,由于编译器本身对String做了足够多的优化,对于简单的String操作,String不比StringBuilder差,因为本身开销都很少,这种时候苛求性能就没太多意义了,只有在我们对String操作的性能敏感的时候,才需要关注他们之间的性能差异,用的时候,要做到心里有数,明白为什么用这个而不用另一个。

最新文章

  1. MUI 个推
  2. 在jybot下跑Selenium2Library
  3. AO总结10:MapControl控件
  4. Java [Leetcode 258]Add Digits
  5. ElaticSearch网站
  6. 基于嵌入式OS的任务设计-----任务划分
  7. NavigationView学习笔记
  8. PLSQL Developer oracle导入导出表及数据
  9. 9 C. Hexadecimal&#39;s Numbers
  10. Python List insert()方法详解
  11. idea操作整理
  12. LeetCode算法题-Valid Palindrome II(Java实现)
  13. storm1.1.0 drpc 部署和调用测试
  14. 8张图让你一步步看清 async/await 和 promise 的执行顺序
  15. Py中map与np.rival学习
  16. Guarding Bananas
  17. [转]Linux的SOCKET编程详解
  18. 建立一个更高级别的查询 API:正确使用Django ORM 的方式(转)
  19. Unity Shader 阶段性反思与总结(一)
  20. HTML文档的经常使用标记

热门文章

  1. Web框架Django
  2. nodejs调用百度统计api摆脱人肉数据统计
  3. quick2.2.6 问题记录
  4. BZOJ5450: 轰炸(水题,Tarjan缩点求最长路)
  5. linux 下执行python.py 无效解决方案
  6. java基本类型和封装类型区别及应用
  7. LeetCode 360. Sort Transformed Array
  8. [深度学习]实现一个博弈型的AI,从五子棋开始
  9. ecmall类关系图(转)
  10. 8.Python编写登录接口