在系統性能優化的時候循環和字符串處理一直是非常值得注意的地方從心態上我們一定不能把自己的眼界放在十次或者是百次循環的層次上也不能把自己要處理的字符串當做是有十個二十個字符每次遇到循環都要假定這個循環是上萬次的每次要處理的字符串的時候一定要告訴自己這個字符串將來有可能是很大的不要等到數據量真的達到十萬百萬的級別之後再采取處理那樣的話成本的消耗就太大了本文將介紹關於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
循環和字符串是程序中最容易提升代碼效率的地方因為很多人在寫程序的時候為了圖一時方便將效率拋在腦後當要處理的數據不大的時候無所謂一旦程序要處理的數據增大那麼性能的瓶頸也就出現了所以就像文章開頭所說的要在寫程序的時候就要考慮十萬百萬的數量級不要等到性能瓶頸出現再去解決因為代碼重構或者說後期的優化成本要遠遠高於前期的開發成本相信看過別人無注釋而又冗長代碼的童鞋深有體會
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25533.html