最近在看公司项目的时候,发现前辈们写的代码很少用到字符串通过"+"号拼接,通过看源码发现package java.lang下有StringBuilder这么个类 StringBuilder用起来相当的方便,特别是在拼接SQL的时候看的一目了然。
网上也有说:消除字符串连接,在程序中优先考虑使用StringBuffer或者StringBuilder代替String。一个字符串相当于一个匿名的String对象,如果在程序中拼接两个字符串那么会在内存中定义三个字符串空间。而StringBuffer或者StringBuilder就不会这么做,而是在原来已有的StringBuffer或者StringBuilder对象中进行修改。不知不觉中性能也能够得到优化,果断用它呗。需要说明的是在StringBuffer和StringBuilder之间如果需要考虑选其一的话原则很简单,前者是线程安全的后者是线程不安全的,换句话说后者比前者更快。综上所述如果单单从性能上考虑的话从高到低依次是:StringBuilder --> StringBuffer --> String。
那么到底怎么用呢?出于是前辈的代码,我就不贴出来了,我倒是比较乐意自己写一点实例
StringBuilder selectSql=new StringBuilder(); selectSql.append("SELECT * FROM T_USER");
说到性能优化 还有一个比较典型的就是循环
之前在没工作前,还真没注意循环这块,在此也跟大家分享下:
1.嵌套for循环中次数多的放在内侧,次数少的放在外侧。不服我们跑个分……
public class Test1{ public static void main (String [] args) { Long time2Before=System.nanoTime(); for (int i=0; i<10;i++ ){ for (int j=0; j<1000000;j++ ){ } } Long time2After=System.nanoTime(); System.out.println("faster--->"+(time2After-time2Before)); Long time1Before=System.nanoTime(); for (int i=0; i<1000000;i++ ){ for (int j=0; j<10;j++ ){ } } Long time1After=System.nanoTime(); System.out.println("slower--->"+(time1After-time1Before)); } }
贴出三次运行结果:
1. faster--->7299516 slower--->9647842 2. faster--->16731410 slower--->9899507 3. faster--->17344766 slower--->8592737
2.在循环中只做与循环相关的事情,一些不必要的循环不要放到循环当中去做。比如在遍历集合的时候没有必要将取得集合大小放在循环中去做,完全可以放在集合的外边。效果上没区别,性能上差距巨大。
import java.util.*; public class Test1{ public static void main (String [] args) { List<String> list=new ArrayList<String>(); for(int i=0;i<1000000;i++){ list.add("luck"+i); } Long time1Before=System.nanoTime(); for(int i=0;i<list.size();i++){ // System.out.println(list.get(i)); } Long time1After=System.nanoTime(); System.out.println("use .size-->"+(time1After-time1Before)); Long time2Before=System.nanoTime(); int n=list.size(); for(int i=0;i<n;i++){ // System.out.println(list.get(i)); } Long time2After=System.nanoTime(); System.out.println("do not use .size-->"+(time2After-time2Before)); } }
贴出三次运行结果:
1. use .size-->4907262 do not use .size-->4176079 2. use .size-->7835279 do not use .size-->6333089 3. use .size-->8000729 do not use .size-->6663169
不要等到遇到性能瓶颈的时候再去优化代码,而是在开发时候也要适当的考虑,相比遇到性能瓶颈时再去重构这些小细节的代码,一个好的编程习惯就显得特别重要了。