java

位置:IT落伍者 >> java >> 浏览文章

Java循环与字符串代码优化


发布日期:2023年02月11日
 
Java循环与字符串代码优化

在系统性能优化的时候循环和字符串处理一直是非常值得注意的地方从心态上我们一定不能把自己的眼界放在十次或者是百次循环的层次上也不能把自己要处理的字符串当做是有十个二十个字符每次遇到循环都要假定这个循环是上万次的每次要处理的字符串的时候一定要告诉自己这个字符串将来有可能是很大的不要等到数据量真的达到十万百万的级别之后再采取处理那样的话成本的消耗就太大了本文将介绍关于Java代码中循环和字符串的优化方法希望对读者有用

关于循环

嵌套for循环中次数多的放在内侧次数少的放在外侧众所周知for循环需要定义一个循环变量来遍历每一个需要循环的对象那么如果循环次数多的循环放在外侧那么无疑将会使得总体的变量增多效率自然会降低下面进行代码测试

public class Test{
public static void main (String [] args)
{
Long timeBefore=SystemnanoTime();
for (int i=; i<;i++ ){
for (int j=; j<;j++ ){

}
}
Long timeAfter=SystemnanoTime();
Systemoutprintln(faster>+(timeAftertimeBefore));

Long timeBefore=SystemnanoTime();
for (int i=; i<;i++ ){
for (int j=; j<;j++ ){

}
}
Long timeAfter=SystemnanoTime();
Systemoutprintln(slower>+(timeAftertimeBefore));
}
}

在循环中只做与循环相关的事情一些不必要的循环不要放到循环当中去做比如在遍历集合的时候没有必要将取得集合大小放在循环中去做完全可以放在集合的外边效果上没区别性能上差距巨大

import javautil*;
public class Test{
public static void main (String [] args)
{
List<String> list=new ArrayList<String>();
for(int i=;i<;i++){
listadd(luck+i);
}

Long timeBefore=SystemnanoTime();
for(int i=;i<listsize();i++){
//Systemoutprintln(listget(i));
}
Long timeAfter=SystemnanoTime();
Systemoutprintln(use size>+(timeAftertimeBefore));

Long timeBefore=SystemnanoTime();
int n=listsize();
for(int i=;i<n;i++){
//Systemoutprintln(listget(i));
}
Long timeAfter=SystemnanoTime();
Systemoutprintln(do not use size>+(timeAftertimeBefore));

}
}

关于字符串

消除字符串连接在程序中优先考虑使用StringBuffer或者StringBuilder代替String一个字符串相当于一个匿名的String对象如果在程序中拼接两个字符串那么会在内存中定义三个字符串空间而StringBuffer或者StringBuilder就不会这么做而是在原来已有的StringBuffer或者StringBuilder对象中进行修改测试代码如下

public class Test{
public static void main (String [] args)
{
long timeBefore=SystemnanoTime();
String str=;
for(int i=;i<;i++){
str+=i;
}
long timeAfter=SystemnanoTime();
Systemoutprintln(use String > +(timeAftertimeBefore));

long timeBefore=SystemnanoTime();
StringBuilder sbuilder=new StringBuilder();
for(int i=;i<;i++){
sbuilderappend(i);
}
long timeAfter=SystemnanoTime();
Systemoutprintln(use StringBuilder> +(timeAftertimeBefore));

long timeBefore=SystemnanoTime();
StringBuffer stringBuffer=new StringBuffer();
for(int i=;i<;i++){
stringBufferappend(i);
}
long timeAfter=SystemnanoTime();
Systemoutprintln(use StringBuffer> +(timeAftertimeBefore));
}
}

需要说明的是在StringBuffer和StringBuilder之间如果需要考虑选其一的话原则很简单前者是线程安全的后者是线程不安全的换句话说后者比前者更快综上所述如果单单从性能上考虑的话从高到低依次是StringBuilder > StringBuffer > String

循环和字符串是程序中最容易提升代码效率的地方因为很多人在写程序的时候为了图一时方便将效率抛在脑后当要处理的数据不大的时候无所谓一旦程序要处理的数据增大那么性能的瓶颈也就出现了所以就像文章开头所说的要在写程序的时候就要考虑十万百万的数量级不要等到性能瓶颈出现再去解决因为代码重构或者说后期的优化成本要远远高于前期的开发成本相信看过别人无注释而又冗长代码的童鞋深有体会

               

上一篇:怎样用java实现验证码

下一篇:Java理论与实践: 正确使用Volatile变量