javafor效率
❶ java中迭代列表中數據時幾種循環寫法的效率比較
Java中經常會用到迭代列表數據的情況,本文針對幾種常用的寫法進行效率比較。雖然網上已經有了類似的文章,但是對他們的結論並不認同。常見的實現方法:1.for循環:for(int i = 0; i < list.size(); i++) for(int i = 0, size = list.size(); i < size; i++) 一般人都會認為第二種寫法效率高。 2.foreach:for(Object obj : list) 這是一種簡潔的寫法,只能對列表進行讀取,無法修改。 3.while:int size = list.size(); while(size-- > 0) 4.迭代: Object iter = list.iterator(); while(iter.hasNext()) { iter.next(); }測試代碼: 針對以上幾種方法編寫的測試代碼。 public static void main(String[] args) { List list = new ArrayList(); int runTime = 1000;//執行次數 for (int i = 0; i < 1000 * 1000; i++) { list.add(i); } int size = list.size(); long currTime = System.currentTimeMillis();//開始分析前的系統時間 //基本的for for(int j = 0; j < runTime; j++) { for (int i = 0; i < size; i++) { list.get(i); } } long time1 = System.currentTimeMillis(); //foreach for(int j = 0; j < runTime; j++) { for (Integer integer : list) { } } long time2 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) { //while int i = 0 ; while(i < size){ list.get(i++); } } long time3 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) {//普通for循環 for (int i = 0; i < list.size(); i++) { list.get(i); } } long time4 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) {//迭代 Iterator iter = list.iterator(); while(iter.hasNext()) { iter.next(); } } long time5 = System.currentTimeMillis(); long time = time1 - currTime ; System.out.print("use for:" + time); time = time2 - time1; System.out.print("\tuse foreach:" + time); time = time3 - time2; System.out.print("\tuse while:" + time); time = time4 - time3; System.out.print("\tuse for2:" + time); time = time5 - time4; System.out.print("\tuse iterator:" + time); System.out.println(); }輸出結果(JDK1.6):1.use for:8695 use foreach:17091 use while:6867 use for2:7741 use iterator:14144 2.use for:8432 use foreach:18126 use while:6905 use for2:7893 use iterator:139763.use for:8584 use foreach:17177 use while:6875 use for2:7707 use iterator:14345 結論:1.針對列表的 foreach的效率是最低:耗時是普通for循環的2倍以上。個人理解它的實現應該和iterator相似。2. list.size()的開銷很小:list.size()次數多少對效率基本沒有影響。查看ArrayList的實現就會發現,size()方法的只是返回了對象內的長度屬性,並沒有其它計算,所以只存在函數調用的開銷。對數組的測試:將代碼中的列表list換做數組再進行測試(iterator不適用),發現耗時基本為0。說明: 3. 列表的get()方法開銷不少應該主要是檢測數據合法性時產生的。將執行次數增加100萬倍,這時可以看出結果基本相等,並沒有明顯的差異。說明:4. 數組length也沒有開銷可見數組長度並不是每次執行的時候都要計算的。聯想一下Java創建數組的時候要求必須指定數組的長度,編譯處理的時候顯然沒有把這個值拋棄掉。網上有一篇類似的文章,它居然得出了一個foreach執行效率最高的結論。
❷ 在java中,foreach 和 iterator遍歷集合時,那個效率更高一些
你好,前者效率更高
原因是for直接針對集合里的下一個對象
而iterator其實相當於專是一個指針,這樣說不準確,但屬是可以這樣理解,每次執行它會先查找當前指向的對象,然後指針再指向下一個位置
所以說,如果有指針概念的話,for的「針對」直接是簡單數據,而iterator的指針卻是一個對象
❸ java中for循環和迭代器哪個效率高,緊急求答
摘抄至 cxxyjsj 的回答,我個人贊成此觀點:
記錄的存取方式有兩種:一版種是順序存儲,另一種是鏈接權存儲
對於順序存儲的記錄可以根據其下標找到對應的記錄,而鏈接存儲(拿單鏈表為例)
則必須找到其前一個記錄的位置才能夠找到本記錄。
所以for循環便於訪問順序存儲的記錄,比如數組等
而迭代則更適用於鏈接存儲的記錄,雖然Java中有些底層通過鏈接存儲原理實現的集合
也可以通過下標獲取指定的記錄,但是其每次都必須從鏈表頭開始查找記錄,這樣會影響查找的效率
❹ java 大量for循環如何優化
主要思想就是減少方法的壓棧次數
最少的循環放到外面,最大的放到裡面即可。
把循環次數少的放外面,多的放裡面,因為越到外面,執行次數要越少,下面是具體代碼,你看看
內大外小
for( int k=0;k <10;k++){
for(int j=0;j <100;j++){
for(int i=0;i <1000;i++){
function(i,j,k);
}
}
}
k <10;k++; 執行10次
j <100;j++ 執行10*100次
i <1000;i++ 執行10*100*1000次
function(i,j,k); 執行10*100*1000次
共執行語句數=(10+10*100+10*100*1000)*2+10*100*1000=3002020
內小外大
for( int k=0;k <1000;k++){
for(int j=0;j <100;j++){
for(int i=0;i <10;i++){
function(i,j,k);
}
}
}
k <1000;k++; 執行1000次
j <100;j++ 執行1000*100次
i <10;i++ 執行10*100*1000次
function(i,j,k); 執行10*100*1000次
共執行語句數=(1000+1000*100+10*100*1000)*2+10*100*1000=3202000
所以執行效率應該是內大外小更高一些
內小外大-內大外小=3202000條語句-3002020條語句=199980條語句
❺ java中for循環和迭代器哪個效率高
java中迭代器效率來高源
ArrayList實現了RandomAccess介面,RandomAccess介面為ArrayList帶來了什麼好處呢?
我們查看一下RandomAccess的源碼文檔,發現有這樣一段描述:
As a rule of thumb, aListimplementation should implement this interface if, for typical instances of the class, this loop:
for (int i=0, n=list.size(); i < n; i++)
list.get(i);
runs faster than this loop:
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
從描述中,可以看出實現RandomAccess介面的集合類,使用for循環的效率會比Iterator高。
RandomAccess介面為ArrayList帶來的好處:
1、可以快速隨機訪問集合。
2、使用快速隨機訪問(for循環)效率可以高於Iterator。
❻ java中一下兩種方式遍歷數組哪種效率高
第一個好像沒遍歷.其次,第一個如果輸出的是List.get(0),那麼其實這兩種方法是一樣的版.寫法不權同而已.
第一,你的第一個for循環肯定是紅線的,因為寫的不對,如果寫對了,他們兩個其實是一個方法.上面也說了,寫法不同而已
❼ JDK1.8的foreach循環效率不如for循環,它為什麼還要出現
1.如果只是遍歷集合或抄者數襲組,用foreach好些,快些。2.如果對集合中的值進行修改,就要用for循環了。其實foreach的內部原理其實也是Iterator,但它不能像Iterator一樣可以人為的控制,而且也不能調用iterator.remove();更不能使用下標來訪問每個元素,所以不能用於增加,刪除等復雜的操作。舉個例子:for(Stringaid:list){if(aid.equals("aa")){list.remove(aid);//這行會報錯,不能修改list的長度}}所以foreach語句是for語句的特殊簡化版本,但是foreach語句並不能完全取代for語句。
❽ java 後執行的for循環比先執行的for循環速度快
程序是從main方法入口,然後從上到下去執行的。
執行過程如下:
先執行 第一專個for循環屬,再到第一個for循環的外層第一個,到第一個for循環的內層0-99次。
當第一個for循環的執行完成之後。再執行第二個for循環。
------------------------------------------------------------------------
這里強調一點:程序是從上到下執行的,第一個for循環如果沒有執行完成,第二個for循環就不能執行,這有點像上廁所一樣,裡面的人不完事,外面的就只能一直等。
不理解的可以追問
❾ java循環替換字元串循環次數太多效率差怎麼辦
這樣就OK了,你試一下
class Test
{
public static void main(String[] args)
{
int max=1;
String[] strs={"a","b","f","a","d","c","e","d","a","d"};
for(int i=0;i<strs.length-1;i++)
{
int count=1;
for(int j=i+1;j<strs.length;j++)
{
if(strs[i].equals(strs[j]))
count++;
}
if(max<count)
max=count;
}
System.out.println("重復最多次數為:"+max);
for(int i=0;i<strs.length-1;i++)
{
int count=1;
for(int j=i+1;j<strs.length;j++)
{
if(strs[i].equals(strs[j]))
count++;
}
if(count==max)
System.out.println("重復最多次("+max+")的字回符答串為:"+strs[i]);
}
}
}
❿ [Java] For loop與if 兩種寫法的效率
第二個。
最多執行2次判斷 10次循環;
第一個10次循環 10-20次if判斷;