一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|

服務(wù)器之家 - 編程語言 - JAVA教程 - 詳解Java中的增強(qiáng) for 循環(huán) foreach

詳解Java中的增強(qiáng) for 循環(huán) foreach

2020-09-25 15:13YSOcean JAVA教程

foreach 是 Java 中的一種語法糖,幾乎每一種語言都有一些這樣的語法糖來方便程序員進(jìn)行開發(fā),編譯期間以特定的字節(jié)碼或特定的方式來對(duì)這些語法進(jìn)行處理。能夠提高性能,并減少代碼出錯(cuò)的幾率。

foreachJava 中的一種語法糖,幾乎每一種語言都有一些這樣的語法糖來方便程序員進(jìn)行開發(fā),編譯期間以特定的字節(jié)碼或特定的方式來對(duì)這些語法進(jìn)行處理。能夠提高性能,并減少代碼出錯(cuò)的幾率。在 Java 中還有比如 泛型、自動(dòng)拆箱、自動(dòng)裝箱、內(nèi)部類、枚舉等等。

foreach 是用來對(duì)數(shù)組或者集合進(jìn)行遍歷的語法。具體語法如下:

?
1
2
for(元素類型 ele : 數(shù)組名/Iterable 實(shí)例){
}

下面我們用 foreach 來對(duì)數(shù)組和一個(gè)集合進(jìn)行遍歷:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int [] array = {1,2,3};
 
for(int i : array){
 
  System.out.println(i);
 
}
 
   
 
List list = new ArrayList();
 
list.add(1);
 
list.add(2);
 
list.add(3);
 
for(Object obj : list){
 
  System.out.println(obj);
 
}

然后我們可以通過反編譯工具,查看 class 文件內(nèi)容:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
int array[] = {1,2,3};
 
  int [] array$ = array;
 
  for(int len$ = array$.length, i$ = 0; i$<len$; ++i$ )
 
  {
 
    int i = array$[i$];
 
    {
 
      System.out.println(i);
 
    }
 
  }
  List list = new ArrayList();
 
  list.add(1);
 
  list.add(2);
 
  list.add(3);
 
  for(java.util.Iterator i$ = list.iterator(); i$.hasNext();)
 
  {
 
    String s = (String) i$.next();
 
    {
 
      System.out.println(s);
 
    }
 
  }

很明顯:

1、對(duì)于數(shù)組,foreach 循環(huán)實(shí)際上還是用的普通的 for 循環(huán)

2、對(duì)于集合,foreach 循環(huán)實(shí)際上是用的 iterator 迭代器迭代

 注意:如果我們想一邊迭代,一邊刪除集合中的元素,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
List list = new ArrayList();
 
list.add(1);<br>    list.add(2);
 
  list.add(3);
 
for(Object obj : list){
 
  System.out.println(obj);
 
  list.remove(obj); //一邊迭代一邊刪除
 
}

這樣寫會(huì)報(bào)如下錯(cuò)誤:這是一個(gè)并發(fā)修改異常報(bào)錯(cuò)

詳解Java中的增強(qiáng) for 循環(huán) foreach

原因:當(dāng)?shù)鬟\(yùn)行的時(shí)候,在當(dāng)前線程 A 中,會(huì)單獨(dú)的創(chuàng)建一個(gè)線程 B。A 負(fù)責(zé)繼續(xù)迭代,B 線程負(fù)責(zé)刪除。B 線程每次都會(huì)去檢查 A 線程中的元素是否相同,如果不是就會(huì)報(bào)錯(cuò)

詳解Java中的增強(qiáng) for 循環(huán) foreach

因?yàn)樯厦鎰h除的方法是 使用 Collection(ArrayList 的父類) 集合中的 remove()方法。該方法只能從集合中刪除元素,不能把迭代器中的元素也刪除了。

解決辦法:使用 iterator 迭代器中的remove()方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Iterator it = list.iterator();
 
while(it.hasNext()){
 
  Object obj = it.next();
 
  System.out.println(obj);
 
  if(obj.equals(1)){
 
   it.remove();//這里是用 迭代器的 remove() 方法<br>       //list.remove(obj);//如果你用 集合 方法,那么還是會(huì)報(bào)錯(cuò)
 
  }
 
    }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/ysocean/p/6822679.html?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人中文字幕在线观看 | 白虎喷水| 成人久久18免费网站 | 99热这里只有精品久久免费 | 女仆掀起蕾丝裙被打屁股作文 | 香蕉视频在线观看网站 | 欧美一级高清片免费一级 | 亚洲乱亚洲乱妇41p国产成人 | 闺蜜高h | 国产特级毛片aaaaaa | 小小水蜜桃视频高清在线观看免费 | 亚洲欧美日韩中文高清一 | yy6080久久国产伦理 | 国产成人盗摄精品 | 99精品国产成人一区二区 | 大团圆免费阅读全文 | 色综合久久综合网欧美综合网 | 午夜 在线播放 | 丁香五香天堂网 | 校园纯肉H教室第一次 | 男人午夜免费视频 | 国产乱妇无码大片在线观看 | 九9热这里只有真品 | 亚洲日韩精品欧美一区二区 | 男人边吃奶边做好爽视频免费 | 日韩欧美国产在线 | 亚洲精品久久啪啪网站成年 | 午夜精品久久久久久久99蜜桃 | 无人视频在线观看完整版高清 | 欧美在线一二三区 | 四虎1515hh.com | 久久成人永久免费播放 | 熟睡中的麻麻大白屁股小说 | 手机av影院| 久久国产乱子伦精品免费不卡 | 欧美综合精品一区二区三区 | heyzo在线观看 | chinese老太grandma | 91视频综合网 | 亚洲 日本 天堂 国产 在线 | 99精品影视 |