成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

怎么使用Java的For循環(huán)

這篇文章主要介紹“怎么使用Java的For循環(huán)”,在日常操作中,相信很多人在怎么使用Java的For循環(huán)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么使用Java的For循環(huán)”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡程序員、網(wǎng)頁設計師等,應用各種網(wǎng)絡程序開發(fā)技術和網(wǎng)頁設計技術配合操作的協(xié)同工作。成都創(chuàng)新互聯(lián)專業(yè)提供成都網(wǎng)站設計、網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站制作(企業(yè)站、成都響應式網(wǎng)站建設公司、電商門戶網(wǎng)站)等服務,從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗的提升,我們力求做到極致!

一、基礎的for循環(huán)

1、使用while也是一種循環(huán)方式,此處探究for相關的循環(huán),就不做拓展了。

2、遍歷數(shù)組的時候,初學時是使用的如下樣式的for循環(huán):

for(int i=0;i<a.length;i++){     System.out.println(n); }

3、而遍歷集合的時候使用的都是Iterator迭代器:

給定一組人名,兩兩組隊(此處允許自己和自己組隊),實現(xiàn)如下:

enum Option {Tom, Jerry, Jack, Mary}

想象中的寫法是:

Collection<Option> options = Arrays.asList(Option.values()); for(Iterator<Option> i = options.iterator(); i.hasNext();){     for (Iterator<Option> j = options.iterator(); j.hasNext();) {         System.out.println(i.next()+" "+j.next());     }

但是執(zhí)行過后你會發(fā)現(xiàn)這段代碼是有瑕疵的,出現(xiàn)的結果只有四組:

怎么使用Java的For循環(huán)

那么剩下的組合去哪里了呢?

這里程序并不會拋出異常,只是單純的因為i.next()每次都會取下一個值,所以就出現(xiàn)了上圖的情況。

但是,如果外部集合的元素大于內(nèi)部元素:

例如下面這段代碼:

enum OptionFirst {Tom, Jerry, Jack, Mary} enum OptionSecond {Tom, Jerry, Jack, Mary, Mali, Tomsun, Lijie, Oolyyou}  public static void main(String[] args) {     Collection<OptionFirst> optionFirstCollection = Arrays.asList(OptionFirst.values());     Collection<OptionSecond> optionSecondCollection = Arrays.asList(OptionSecond.values());     for (Iterator<OptionFirst> i = optionFirstCollection.iterator(); i.hasNext(); ) {         for (Iterator<OptionSecond> j = optionSecondCollection.iterator(); j.hasNext(); ) {             System.out.println(i.next() + " " + j.next());         }     } }

運行后,就會拋出java.util.NoSuchElementException異常,造成的原因就是因為外部循環(huán)調(diào)用了多次,而內(nèi)部循環(huán)因為元素不足,導致循環(huán)拋出了這樣的異常。

要想解決這種困擾只需要在二次循環(huán)前添加一個變量來保存外部元素;即可實現(xiàn)想要達到的效果。

Collection options = Arrays.asList(Option.values());  for(Iterator i = options.iterator(); i.hasNext();){  Option option = i.next();  for (Iterator j = options.iterator(); j.hasNext();) {  System.out.println(option+" "+j.next());  }  }

怎么使用Java的For循環(huán)

二、for-each循環(huán)

這種循環(huán)方式不論是數(shù)組還是集合都實用,而且效率更高;表達形式更加簡潔明了。

for(Element e:elements){     System.out.println(e); }

當再次遇到上面的兩兩組隊問題時,根本不需要考慮元素不足的問題,而且代碼也簡潔多了:

for (Option option : options) {     for (Option rank : options) {         System.out.println(option + " " + rank);     } }

《Effective Java》中是這樣子寫for-each循環(huán)的:

怎么使用Java的For循環(huán)

三、for-each is not god

說了for-each那么多好處,但是它也不是神,并非萬能的,有那么三種情況是它需要注意的。

3.1、解構過濾的時候不能使用

如果需要遍歷集合,并刪除選定的元素,就需要使用顯式的迭代器,以便可以調(diào)用它的remove方法。不過在Java8中增加的Collection的removeIf方法常??梢员苊怙@式的遍歷。

例如下面這段代碼:

List<String> list = new ArrayList<String>();  list.add("1"); list.add("2");  for (String item : list) {     if ("1".equals(item)) {         list.remove(item);         System.out.println("執(zhí)行if語句成功");     } }

直接運行這段代碼是沒什么問題的,數(shù)組list能成功刪除元素1,也能打印對應語句。

但是,我們進行如下任意一種操作:

  • 若把list.remove(item)換成list.add(“3”);操作如何?

  • 若在第6行添加list.add("3");那么代碼會出錯嗎?

  • 若把if語句中的“1”換成“2”,結果你感到意外嗎?

如果都能正確執(zhí)行當然就不需要問了,所以3個都會報ConcurrentModificationException的異常;

怎么使用Java的For循環(huán)

執(zhí)行結果異常

而出現(xiàn)這些情況的原因稍稍解釋下就是:

首先,這涉及多線程操作,Iterator是不支持多線程操作的,List類會在內(nèi)部維護一個modCount的變量,用來記錄修改次數(shù)。

舉例:ArrayList源碼

protected transient int modCount = 0;

每生成一個Iterator,Iterator就會記錄該modCount,每次調(diào)用next()方法就會將該記錄與外部類List的modCount進行對比,發(fā)現(xiàn)不相等就會拋出多線程編輯異常。

為什么這么做呢?我的理解是你創(chuàng)建了一個迭代器,該迭代器和要遍歷的集合的內(nèi)容是緊耦合的,意思就是這個迭代器對應的集合內(nèi)容就是當前的內(nèi)容,我肯定不會希望在我冒泡排序的時候,還有線程在向我的集合里插入數(shù)據(jù)對吧?所以Java用了這種簡單的處理機制來禁止遍歷時修改集合。

至于為什么刪除“1”就可以呢,原因在于foreach和迭代器的hasNext()方法,foreach這個語法,實際上就是

while(itr.hasNext()){     itr.next() }

所以每次循環(huán)都會先執(zhí)行hasNext(),那么看看ArrayList的hasNext()是怎么寫的:

public boolean hasNext() {     return cursor != size; }

cursor是用于標記迭代器位置的變量,該變量由0開始,每次調(diào)用next執(zhí)行+1操作,于是:

所以代碼在執(zhí)行刪除“1”后,size=1,cursor=1,此時hasNext()返回false,結束循環(huán),因此你的迭代器并沒有調(diào)用next查找第二個元素,也就無從檢測modCount了,因此也不會出現(xiàn)多線程修改異常;但當你刪除“2”時,迭代器調(diào)用了兩次next,此時size=1,cursor=2,hasNext()返回true,于是迭代器傻乎乎的就又去調(diào)用了一次next(),因此也引發(fā)了modCount不相等,拋出多線程修改的異常。

當你的集合有三個元素的時候,你就會神奇的發(fā)現(xiàn),刪除“1”是會拋出異常的,但刪除“2”就沒有問題了,究其原因,和上面的程序執(zhí)行順序是一致的。

因此,在《阿里巴巴Java開發(fā)手冊中有這樣一條規(guī)定》:

怎么使用Java的For循環(huán)

3.2、轉(zhuǎn)換

如果需要遍歷列表或數(shù)組,并取代它的部分或者全部元素值,就需要使用列表迭代器或者數(shù)組索引,以便替換元素的值。

因為for-each是一循到底的,中間不做停留和位置信息的顯示;所以要替換元素就不能使用它了。

3.3、平行迭代

如果需要并行的遍歷多個集合,就需要顯式的控制迭代器或者索引變量,以便所有迭代器或者索引變量都可以同步前進(就像上面講述Iterator迭代器的時候提到的組合減少的情況,只想出現(xiàn)下標一一對應的元素組合)。

到此,關于“怎么使用Java的For循環(huán)”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

網(wǎng)站標題:怎么使用Java的For循環(huán)
網(wǎng)頁URL:http://jinyejixie.com/article28/ggeecp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設、營銷型網(wǎng)站建設、電子商務網(wǎng)站內(nèi)鏈、ChatGPT、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
洛阳市| 保德县| 响水县| 浪卡子县| 江山市| 桂阳县| 兴文县| 舟曲县| 新蔡县| 潢川县| 临高县| 屏南县| 托克逊县| 八宿县| 青阳县| 绥芬河市| 太湖县| 望谟县| 洪湖市| 禄丰县| 太和县| 云安县| 五家渠市| 中山市| 图木舒克市| 嘉定区| 绩溪县| 通山县| 鄢陵县| 武鸣县| 钟山县| 上蔡县| 即墨市| 泗洪县| 桦南县| 屏边| 紫阳县| 马尔康县| 江油市| 安远县| 额尔古纳市|