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);