最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java for-each循環(huán)使用難題2例(高級使用方法)

 更新時間:2014年04月24日 10:43:41   作者:  
從Java5起,在Java中有了for-each循環(huán),可以用來循環(huán)遍歷collection和array。For each循環(huán)允許你在無需保持傳統(tǒng)for循環(huán)中的索引,或在使用iterator /ListIterator時無需調(diào)用while循環(huán)中的hasNext()方法就能遍歷collection

Java中,for-each循環(huán)簡化了任何Collection或array的遍歷過程,但并不是每個Java程序員都了解本文將要描述的for-each 循環(huán)的一些細節(jié)。與 Java5 發(fā)布的其他術(shù)語:釋放別名泛型,自動封裝和可變參數(shù)不同,Java開發(fā)者對for-each循環(huán)的使用比任何其他特性更加頻繁,但當問及高級的for-each循環(huán)怎樣工作,或什么是在for-each循環(huán)中使用Collection時的基本需求時,就不是每個人都能夠回答的了。

本篇教程和例子旨在通過深入研究for-each 循環(huán)中幾個有趣的難題來填補上述空白(說明上述問題)。好了,不再贅述,一起看看我們在Java5 for-each循環(huán)的第一個問題。


高級循環(huán)問題 1

考慮下面這段遍歷一個用戶自定義的aggregator或collection類的代碼,這段代碼將會打印出什么,拋出異常還是編譯器錯誤:

復(fù)制代碼 代碼如下:

package test;

/**
  * Java Class to show how for-each loop works in Java
  */
public class ForEachTest { 

    public static void main(String args[]){
        CustomCollection<String> myCollection = new CustomCollection<String>();
        myCollection.add("Java");
        myCollection.add("Scala");
        myCollection.add("Groovy");

        //What does this code will do, print language, throw exception or compile time error
        for(String language: myCollection){
            System.out.println(language);
        }
    }
}

下面是我們的CustomCollection類,這是個參數(shù)為泛型的類,與任何其他的Collection類相似,依靠于ArrayList并提供從Collection中添加和刪除項的方法。

復(fù)制代碼 代碼如下:

package test;

public class CustomCollection<T>{
    private ArrayList<T> bucket;

    public CustomCollection(){
        bucket = new ArrayList();
    }

    public int size() {
        return bucket.size();
    }

    public boolean isEmpty() {
        return bucket.isEmpty();
    }

    public boolean contains(T o) {
        return bucket.contains(o);
    }

    public boolean add(T e) {
        return bucket.add(e);
    }

    public boolean remove(T o) {
        return bucket.remove(o);
    }  

}

答案:

上述代碼將無法通過編譯,這是因為我們的CustomCollection類沒有實現(xiàn)java.lang.Iterable接口,編譯期錯誤如下:

復(fù)制代碼 代碼如下:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - for-each not applicable to expression type

 required: array or java.lang.Iterable
  found:    test.CustomCollection
        at test.ForEachTest.main(ForEachTest.java:24)

從中了解到的一個有趣的事實是:for-each循環(huán)僅應(yīng)用于實現(xiàn)了Iterable接口的Java array和Collection類,而且既然所有內(nèi)置Collection類都實現(xiàn)了java.util.Collection接口,已經(jīng)繼承了Iterable,這一細節(jié)通常會被忽略,這點可以在Collection接口的類型聲明“ public interface Collection extends Iterable”中看到。所以為了解決上述問題,你可以選擇簡單地讓CustomCollection實現(xiàn)Collection接口或者繼承AbstractCollection,這是默認的通用實現(xiàn)并展示了如何同時使用抽象類和接口以獲取更好的靈活性?,F(xiàn)在讓我們來看看for-each循環(huán)的第二個難題:


Java for-each循環(huán)的第二個難題:

在下面的代碼示例將會拋出ConcurrentModificationException異常。這里我們使用標準iterator和for-each循環(huán)遍歷ArrayList,隨后刪除元素,你需要找出哪段代碼將會拋出ConcurrentModificationException ,為什么?請注意,答案可能是兩個都會,都不會或其中之一。

復(fù)制代碼 代碼如下:

package test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
  * Java class to demonstrate inner working of for-each loop in Java
  * @author Javin Paul
  **/
public class ForEachTest2 { 

    public static void main(String args[]){
        Collection<String> list = new ArrayList<String>();
        list.add("Android");
        list.add("iPhone");
        list.add("Windows Mobile");

        // Which Code will throw ConcurrentModificationException, both,
       // none or one of them

        // example 1       
        Iterator<String> itr = list.iterator();
        while(itr.hasNext()){
            String lang = itr.next();
            list.remove(lang);
        }

         // example 2
        for(String language: list){
            list.remove(language);
        }
    }
}

大約70%的Java開發(fā)者都會說第一個代碼塊會拋出ConcurrentModificationException異常,因為我們沒有用iterator的remove方法來刪除元素,而是使用ArrayList的 remove()方法。但是,沒有多少Java開發(fā)者會說出for-each循環(huán)也會出現(xiàn)同樣的問題,因為我們在這里沒有使用iterator。事實上,第二個代碼片段也會拋出ConcurrentModificationException異常,這點在解決了第一個困惑之后就變得很明顯了。既然for-each循環(huán)內(nèi)部使用了Iterator來遍歷Collection,它也調(diào)用了Iterator.next(),這會檢查(元素的)變化并拋出ConcurrentModificationException。你可以從下面的輸出中了解到這點,在注釋掉第一個代碼段后,當你運行第二個代碼段時會得到下面的輸出。

復(fù)制代碼 代碼如下:

Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
        at java.util.AbstractList$Itr.next(AbstractList.java:343)
        at test.ForEachTest2.main(ForEachTest2.java:34)


以上就是關(guān)于Java5 for-each循環(huán)的全部內(nèi)容。我們已經(jīng)看到了Java程序員在編寫遍歷Collection類的代碼時產(chǎn)生的很多問題,特別是在遍歷collection的同時刪除元素的時候。請牢記,在從任何Collection(例如Map、Set或List)中刪除對象時總要使用Iterator的remove方法,也請謹記for-each循環(huán)只是標準Iterator代碼標準用法之上的一種語法糖(syntactic sugar)而已。

譯者注:語法糖(syntactic sugar),也譯為糖衣語法,是由英國計算機科學(xué)家彼得·約翰·蘭達-Peter J. Landin發(fā)明的一個術(shù)語,指計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會。

相關(guān)文章

  • Java中精確的浮點運算操作示例

    Java中精確的浮點運算操作示例

    這篇文章主要介紹了Java中精確的浮點運算操作方法,結(jié)合具體實例形式分析了java浮點數(shù)運算的相關(guān)函數(shù)、使用技巧與注意事項,需要的朋友可以參考下
    2017-06-06
  • Linux環(huán)境下的Java(JDBC)連接openGauss數(shù)據(jù)庫實踐記錄

    Linux環(huán)境下的Java(JDBC)連接openGauss數(shù)據(jù)庫實踐記錄

    這篇文章主要介紹了Linux環(huán)境下的Java(JDBC)連接openGauss數(shù)據(jù)庫實踐記錄,需要的朋友可以參考下
    2022-11-11
  • Java異常區(qū)分和處理的一些經(jīng)驗分享

    Java異常區(qū)分和處理的一些經(jīng)驗分享

    這篇文章介紹了Java異常區(qū)分和處理的一些經(jīng)驗分享,主要是異常選擇和使用中的一些誤區(qū)總結(jié)與歸納,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 關(guān)于Java的動態(tài)代理機制

    關(guān)于Java的動態(tài)代理機制

    這篇文章主要介紹了關(guān)于Java的動態(tài)代理機制,動態(tài)代理就是,在程序運行期,創(chuàng)建目標對象的代理對象,并對目標對象中的方法進行功能性增強的一種技術(shù),需要的朋友可以參考下
    2023-05-05
  • java實現(xiàn)發(fā)送郵件功能

    java實現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)發(fā)送郵件功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • String.join()方法示例詳解

    String.join()方法示例詳解

    String.join() 方法是連接指定數(shù)組的元素或集合的成員,在每個元素或成員之間使用指定的分隔符,這篇文章主要介紹了String.join()方法示例詳解,需要的朋友可以參考下
    2024-01-01
  • Java實現(xiàn)數(shù)獨小游戲

    Java實現(xiàn)數(shù)獨小游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)數(shù)獨小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 基于Java HashMap的死循環(huán)的啟示詳解

    基于Java HashMap的死循環(huán)的啟示詳解

    本篇文章是對Java HashMap的死循環(huán)進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • JVM中如何做到STW使程序暫停

    JVM中如何做到STW使程序暫停

    STW,即Stop The World,這篇文章來為大家詳細介紹了JVM中是如何做到STW使程序暫停的原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-01-01
  • Java String index out of range:100錯誤解決方案詳解

    Java String index out of range:100錯誤解決方案詳解

    這篇文章主要介紹了Java String index out of range:100錯誤解決方案詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評論

岑溪市| 年辖:市辖区| 柏乡县| 易门县| 嫩江县| 阳江市| 手游| 济南市| 西城区| 新闻| 会宁县| 东宁县| 准格尔旗| 盖州市| 翁牛特旗| 温泉县| 和田县| 天镇县| 靖远县| 长葛市| 芷江| 仁化县| 南乐县| 河北区| 若尔盖县| 汕尾市| 正镶白旗| 肥乡县| 县级市| 翁牛特旗| 琼海市| 吉水县| 波密县| 盐城市| 雷波县| 阜城县| 平和县| 和平县| 韩城市| 天长市| 华容县|