码迷,mamicode.com
首页 > 编程语言 > 详细

优化java字符串连接与循环

时间:2015-04-12 01:30:40      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

      最近在看公司项目的时候,发现前辈们写的代码很少用到字符串通过"+"号拼接,通过看源码发现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

不要等到遇到性能瓶颈的时候再去优化代码,而是在开发时候也要适当的考虑,相比遇到性能瓶颈时再去重构这些小细节的代码,一个好的编程习惯就显得特别重要了。

优化java字符串连接与循环

标签:

原文地址:http://my.oschina.net/nyp/blog/399101

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!