天天看點

增強for循環和普通for循環的差別

1.增強for循環和iterator周遊的效果是一樣的,也就說:增強for循環的内部也就是調用iteratoer實作的(可以檢視編譯後的檔案)。但是增強for循環有些缺點,例如不能在增強循環裡動态的删除集合内容,不能擷取下标等。

2.arraylist由于使用數組實作,是以下标明确,最好使用普通循環。

3.而對于 linkedlist 由于擷取一個元素,要從頭開始向後找,是以建議使用增強for循環,也就是iterator。

下面的例子可以證明

public static void main(string[] args)

{

list<integer> list = new arraylist<integer>();

for (int i = 0; i < 5000000; i++)

list.add(11);

}

long start = system.currenttimemillis();

int size = list.size();

int c1 = 1;

for (int i = 0; i < size; i++)

c1 = list.get(i);

system.out.println("for + get(i)方法: " + (system.currenttimemillis() - start));

long start2 = system.currenttimemillis();

for (int c2 : list)

system.out.println("iterator(foreach)方法:" + (system.currenttimemillis() - start2));

結果:

for + get(i)方法: 94

iterator(foreach)方法:234

在把arraylist改為linkedlist,我這裡記憶體溢出了,于是list改成50000

for + get(i)方法: 6969

iterator(foreach)方法:0

---------------------

是以在使用的時候适當選擇就好了。

多線程中的差別:

// for (block b : __blocks) {

// b.ondraw(canvas);

// }

// iterator<block> it = __blocks.iterator();

// while(it.hasnext()){

// block b = it.next();

for(int i = 0; i < __blocks.size(); i++){

__blocks.get(i).ondraw(canvas);

 另外外一個線程動态的改變__blocks的大小    隻有普通for循環不報錯,其他通過疊代器實作的

是先有一個拷貝,是以真正得到時 ,會報并發修改錯誤。

在單線程中:  

增強for不能動态删除元素,用iterator能實作。

示例代碼

map<string, string> map = new hashmap<string, string>();

map.put("1", "a1");

map.put("2", "a2");

map.put("3", "a3");

map.put("4", "a4");

map.put("5", "a5");

for (string key : map.keyset()) {

if ("a2".equals(map.get(key))) {

map.remove(key);

system.out.println(map.size());

list<string> list = new arraylist<string>();

list.add("a1");

list.add("a2");

list.add("a3");

list.add("a4");

list.add("a5");

iterator<string> it = list.iterator();

while (it.hasnext()) {

string v = it.next();

if ("a2".equals(v)) {

it.remove();

for (string v : list) {

system.out.println(v);

繼續閱讀