优化java字符串连接与循环

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

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

时间: 2024-10-24 17:32:55

优化java字符串连接与循环的相关文章

Java字符串连接的几种方式

Java字符串连接的几种方式 字符串表现的几种方式 StringBuffer和StringBuilder及String的继承关系 字符串的连接 1.String的连接方法 可以看出连接方式是新建了一个包含两个长度的字符数组,然后进行连接. 2.StringBuilder中存储字符串其实用的是一个char数组,capacity其实就是指定这个char数组的大小,StringBuilder的连接方法是继承AbstractStringBuilder的方法的,线程不安全的 在append(str)函数调

Java 字符串操作实例

本文章向大家分享一些java中操作字符串的一些实例,需要的可以参考一下. Java字符串比较 Java查找字符串最后一次出现的位置 Java删除字符串中的一个字符 Java字符串替换 Java字符串反转 Java字符串查找 Java字符串分割 Java字符串小写转大写 Java测试两个字符串区域是否相等 Java字符串性能比较测试 Java字符串优化 Java字符串格式化 Java字符串连接

JAVA字符串的优化

Java 程序优化:字符串操作.基本运算方法等优化策略 看了这篇文档,略有所感,所以本篇算是一个读后感.和上篇JAVA一种提升输出速度的方法 进一步. 主要涉及了7种优化方式. 1.subString(begin,end): subString是截取String中一段的方法,我在这个上面还吃过苦头的,之前做过一个大数据量的subString一直OOM,没找到解决办法,今天看到文中提到如果使用 return new String(string.substring(begin,end)) 代替 re

java中+(加号或字符串连接)运算顺序的问题

由于java中+(加号或字符串连接)的运算顺序是从左向右的,所以一下程序的输出会得到两个不同的结果 1 public class Test { 2 public static void main(String[] args) { 3 System.out.println("ddd"+7+5); 4 System.out.println(7+5+"ddd"); 5 6 } 7 } 结果为ddd75 12ddd

JavaSE复习日记 : Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符

// Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符 /* * 一 Java操作符 * * Java操作符都有哪些? * +, -, *, /, %, ++, -- * 这里需要注意 a++ 和 ++a 的区别,后面说; */ /* public class Javase{ public static void main(String[] args){ int a = 10; int b = 20; int c = 30; System.out.println( a

关于java字符串编译优化问题

情景一:不好的字符串拼接习惯    起因是这样的:一个大牛在写了一篇关于java字符串优化问题的讲解,他提到:不要使用strObj+otherValue的方法将otherValue转换为字符串形式,因为底层操作会让你吓一跳的.那么底层的实质是怎么样的呢?他的意思是这样的: 比如:    String s = "I have"; int  total = 12; Dog dog = new Dog();     //假设Dog类重写了toString方法 String msg = s +

[Java SE] 字符串连接

Java 支持多种字符串连接方式,总结如下: package cn.spads.tool.string; import java.text.MessageFormat; /** * <b>测试字符串连接</b><br> * @author Surmounting * @version V1.1.0 * history * 1.1.0, 2015年9月1日 Surmounting 初版 * @since Java 6.0 */ public class TestStrin

Java字符串拆分和字符串连接

Java里面似乎没有对字符串进行拆分和连接的函数,我自己写了个 1 public class LierString{ 2 //------------------------------------------------------------------------ 3 //接受一个含有空格的字符串,返回一个字符串数组 4 public static String[] toSArr(String arg){ 5 //System.out.println("进入函数StrToASrr"

前端性能优化:字符串的连接操作改进

在web开发中,避免不了字符串连接的操作,但字符串的连接操作性能高吗? 之前有不少文章说使用加号性能低下,建议使用数组的join操作. 测试代码: var length = 300000; /*数组的 join*/ function Test1() { var date1 = new Date().getTime(); var t = []; for (var i = 0; i < length; i++) { t[i] = "name" + i; } arr.join(&quo