1. 程式人生 > >迭代器和for迴圈的效率比較

迭代器和for迴圈的效率比較

實體Person類

package com.zhang.loop;

public class Person {  private String a;  private int b;  public Person(String a, int b) {   super();   this.a = a;   this.b = b;  }  public String getA() {   return a;  }  public void setA(String a) {   this.a = a;  }  public int getB() {   return b;  }  public void setB(int b) {   this.b = b;  }     }

 

測試ArrayList的主程式

package com.zhang.loop;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class TestArrayList {
	private static final int COUNT = 800000;
	private static List<Person> persons = new ArrayList<Person>();
	
	public static void main(String[] args) {
		init();
		System.out.println("for迴圈測試結果:"+testFor());
		System.out.println("foreach迴圈測試結果:"+testForeach());
		System.out.println("iterator迴圈測試結果:"+testIterator());
	}
	
	//初始化集合
	public static void init(){
		for (int i = 0; i <COUNT; i++) {
			persons.add(new Person("第"+i+"個元素",i));
		}
	}
	//for迴圈便利集合
	public static long testFor(){
		long start = System.nanoTime();
		Person p = null;
		for (int i = 0; i < persons.size(); i++) {
			p = persons.get(i);
		}
		return (System.nanoTime()-start)/1000;
	}
	//foreach迴圈便利集合
	public static long testForeach(){
		long start = System.nanoTime();
		Person p = null;
		for (Person person : persons) {
			p = person;
		}
		return (System.nanoTime()-start)/1000;
	}
	//iterator迴圈便利集合
	public static long testIterator(){
		long start = System.nanoTime();
		Person p = null;
		Iterator<Person> itreator = persons.iterator();
		while(itreator.hasNext()){
			p = itreator.next();
		}
		return (System.nanoTime()-start)/1000;
	}
	
}

 ArrayList測試結果

測試LinkedList的主程式

package com.zhang.loop;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class TestArrayList {
	private static final int COUNT = 8000;
	private static List<Person> persons = new LinkedList<Person>();
	
	public static void main(String[] args) {
		init();
		System.out.println("for迴圈測試結果:"+testFor());
		System.out.println("foreach迴圈測試結果:"+testForeach());
		System.out.println("iterator迴圈測試結果:"+testIterator());
	}
	
	//初始化集合
	public static void init(){
		for (int i = 0; i <COUNT; i++) {
			persons.add(new Person("第"+i+"個元素",i));
		}
	}
	//for迴圈便利集合
	public static long testFor(){
		long start = System.nanoTime();
		Person p = null;
		for (int i = 0; i < persons.size(); i++) {
			p = persons.get(i);
		}
		return (System.nanoTime()-start)/1000;
	}
	//foreach迴圈便利集合
	public static long testForeach(){
		long start = System.nanoTime();
		Person p = null;
		for (Person person : persons) {
			p = person;
		}
		return (System.nanoTime()-start)/1000;
	}
	//iterator迴圈便利集合
	public static long testIterator(){
		long start = System.nanoTime();
		Person p = null;
		Iterator<Person> itreator = persons.iterator();
		while(itreator.hasNext()){
			p = itreator.next();
		}
		return (System.nanoTime()-start)/1000;
	}
	
}

LinkedList測試結果:


記錄的存取方式有兩種:

             一種是順序儲存(陣列,ArrayList..)可以根據其下標找到對應的記錄

            另一種是連結儲存(LinkedList..)連結儲存(拿單鏈表為例)則必須找到其前一個記錄的位置才能夠找到本記錄。

根據以上可以得到的結果是:for迴圈便於訪問順序儲存的記錄,而foreach和迭代器便於訪問連結儲存。

相關推薦

for迴圈效率比較

實體Person類 package com.zhang.loop;public class Person {  private String a;  private int b;  public Person(String a, int b) {   super();  

pythonfor迴圈原理

我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種: 一類是集合資料型別,如list、tuple、dict、set、str等; 一類是generator,包括生成器和帶yield的generator function。 這些可以直接作用於for迴圈的物件統稱為可迭代物件:Iter

for-of 迴圈

1.、for迴圈(支援break;continue;return等) for (var index = 0; index < myArray.length; index++) { console.log(myArray[index]); } 2、forEach(不支援break;

ES(五)for-of迴圈

一 Iterator(遍歷器)的概念 (1)Iterator的作用有三個: 一是為各種資料結構,提供一個統一的、簡單的訪問介面;二是使得資料結構的成員能夠按照某種次序排列三是ES6創造了一種新的遍歷命

集合 ArrayList 集合的繼承實現關係 Collection Iterator 增強for迴圈 泛型 集合的向下轉型

1.集合介紹    集合,集合是java中提供的一種容器,可以用來儲存多個數據。    我們知道資料多了,可以使用陣列存放或者使用ArrayList集合進行存放資料。那麼,集合和陣列既然都是容器,它們有啥區別呢? 陣列的長度是固定的。集合的長度是可變的。 集合中儲存的元素必須

foreach迴圈

遍歷不同容器的元素,如果為每個容器都設計一套遍歷方法,會很麻煩。迭代器Iterator提供了這樣的便利,它可以遍歷並且得到容器中的物件,而不必關心容器的具體型別。 Java的Iterator只能單向移動。 Iterator由實現了Iterable介面的類的iterator(

ArrayList的 超強for迴圈

超強for迴圈 也是用迭代器實現的。有個面試官,問去除ArrayList的一些元素,當時寫的是for迴圈,判斷去除,然後左邊退一位。他說不安全。用迭代器遍歷安全,迭代器包含一個remove方法,去除元素後自帶遊標退一位。主要三個方法,hasnext,next,和remove

java基礎第十二篇之集合、增強for迴圈泛型

Collection介面中的常用方法: * 所有的子類子介面都是具有的 * 集合的方法:增刪改查 * * public boolean add(E e);//新增元素 返回值表示是否新增成功 * public boolean remove(Object o);//刪除元素,返回值表示是否刪除成

Iterator增強for的注意事項

Iterator迭代器和增強for常見的注意事項 1. 如果沒有元素可迭代了,仍然呼叫next方法則會丟擲以下異常          java.util.NoSuchElementException:沒有元素異常。

網狀迴圈

OpenMesh還提供所謂的迴圈器,其提供與列舉相同或另一種型別的另一項相鄰的項的方法。 通常,CenterItem_AuxiliaryInformation_TargetItem_Iter指定迴圈器,該迴圈器列舉給定中心項周圍的所有目標項。 迴圈器的構造器具有迴圈器(MeshType mesh,Targ

java-Iterator增強for

一.Iterator迭代器概述 Collection集合元素的通用獲取方式:在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續在判斷,如果還有就再取出出來。一直把集合中的所有元素全部取出。這種取出方式專業術語稱為迭代。 Iterator介面的常用方法如下: hasNext()方法:用

分部類

迭代器 迭代器是可以返回相同型別的值的有序序列的一段程式碼,可用作方法,運算子或get訪問器的程式碼體.迭代器程式碼使用yield return語句依次返回每個元素,yield break語句將終止迭代.可以在類中實現多個迭代器,每個迭代器必須像類成員一樣有唯一的名稱,並且可以在foreac

Python學習之生成器

那麼首先什麼是迭代器和生成器呢? 迭代器即迭代的工具,那麼什麼又是迭代呢?所謂迭代:迭代是一個重複的過程,每次重讀即一次迭代,並且每次迭代的結果都是下一次迭代的初始值。例: l=[1,2,3] count=0 while count < len(l): print(l[count])

關於生成器

迭代器和生成器迭代器 - 概念 可迭代的/可迭代物件   什麼是協議---python規定的 : 可迭代型別 和 python語言之間的協議 可迭代協議---內部含有'__iter__'方法的資料型別都是可迭代的 迭代器協議---內部含有__next__和__iter__方法的變數/值都是迭代器

讀書筆記——Python中的列表解析

Python所謂的迭代協議 有__next__方法的物件會前進到下一個結果,在一系列結果的末尾時,則會引發StopIteration。在Python中,任何這類物件都認為是可迭代的。任何這類物件也能以for迴圈或其他迭代工具遍歷,因為所有迭代工具內部工作起來都是在每次迭代中呼叫__next__,

python_魔法方法(六):生成器

迭代器 自始至終,都有一個概念一直在用,但是我們卻沒來都沒有人在的深入剖析它。這個概念就是迭代。 迭代的意思有點類似迴圈,每一次的重複的過程被稱為迭代的過程,而每一次迭代得到的結果會被用來作為下一次迭代的初始值。提供迭代方法的容器稱為迭代器,通常接觸的迭代器有序列(列表、元組、字串)還有字典也是迭代器,都

TypeScript筆記:生成器(八)

可迭代性 當一個物件實現了Symbol.iterator屬性時,我們認為它是可迭代的。 一些內建的型別如 Array,Map,Set,String,Int32Array,Uint32Array等都已經實現了各自的Symbol.iterator。 物件上的Symbol.it

實戰c++中的vector系列--vector的遍歷(stl演算法、vector(不要在迴圈中判斷不等於end())、operator[])【轉】

(轉自:https://blog.csdn.net/wangshubo1989/article/details/50374914?utm_source=blogxgwz29) 遍歷一個vector容器有很多種方法,使用起來也是仁者見仁。 通過索引遍歷: for (i = 0; i<

物件

基於python3 迭代器 = 可迭代的物件 可迭代的物件 != 迭代器 講在前面: 返回迭代器的物件,有:open(), map(), zip()和filte()函式,這幾個函式直接返回迭代器也就是可以直接在結果中呼叫next 如: f = open('xxx.txt')

ES6 生成器

設計為了更高效的資料處理,避免過多for迴圈巢狀(程式碼複雜度,跟蹤多個迴圈變數) 1. 迭代器: 為迭代過程設計的介面 所有的迭代器物件都有next()方法,每次呼叫都返回一個結果物件,物件有兩個屬性   一個是value, 表示下一個將要返回的值   一個是done,Boolean型別,當沒有更多