国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java for-each循環(huán)使用難題2例(高級(jí)使用方法)

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

2019-11-20 15:35Java教程網(wǎng) JAVA教程

從Java5起,在Java中有了for-each循環(huán),可以用來循環(huán)遍歷collection和array。For each循環(huán)允許你在無需保持傳統(tǒng)for循環(huán)中的索引,或在使用iterator /ListIterator時(shí)無需調(diào)用while循環(huán)中的hasNext()方法就能遍歷collection

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

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


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

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

 

復(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類,這是個(gè)參數(shù)為泛型的類,與任何其他的Collection類相似,依靠于ArrayList并提供從Collection中添加和刪除項(xiàng)的方法。

 

復(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);
    }   

}

 

答案:

上述代碼將無法通過編譯,這是因?yàn)槲覀兊腃ustomCollection類沒有實(shí)現(xiàn)java.lang.Iterable接口,編譯期錯(cuò)誤如下:

復(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)

 

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


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

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

 

復(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ā)者都會(huì)說第一個(gè)代碼塊會(huì)拋出ConcurrentModificationException異常,因?yàn)槲覀儧]有用iterator的remove方法來刪除元素,而是使用ArrayList的 remove()方法。但是,沒有多少Java開發(fā)者會(huì)說出for-each循環(huán)也會(huì)出現(xiàn)同樣的問題,因?yàn)槲覀冊谶@里沒有使用iterator。事實(shí)上,第二個(gè)代碼片段也會(huì)拋出ConcurrentModificationException異常,這點(diǎn)在解決了第一個(gè)困惑之后就變得很明顯了。既然for-each循環(huán)內(nèi)部使用了Iterator來遍歷Collection,它也調(diào)用了Iterator.next(),這會(huì)檢查(元素的)變化并拋出ConcurrentModificationException。你可以從下面的輸出中了解到這點(diǎn),在注釋掉第一個(gè)代碼段后,當(dāng)你運(yùn)行第二個(gè)代碼段時(shí)會(huì)得到下面的輸出。

 

復(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類的代碼時(shí)產(chǎn)生的很多問題,特別是在遍歷collection的同時(shí)刪除元素的時(shí)候。請(qǐng)牢記,在從任何Collection(例如Map、Set或List)中刪除對(duì)象時(shí)總要使用Iterator的remove方法,也請(qǐng)謹(jǐn)記for-each循環(huán)只是標(biāo)準(zhǔn)Iterator代碼標(biāo)準(zhǔn)用法之上的一種語法糖(syntactic sugar)而已。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产一区二区精品在线观看 | 亚洲综合无码一区二区 | 免费观看的av | 成视频年人免费看黄网站 | 在线一级视频 | 久久99国产精品 | 蜜桃免费一区二区三区 | 自拍偷拍欧美 | 国产黄色电影 | 91视频一88av| 亚洲国产视频网站 | 亚洲国产精品一区二区第一页 | 91 在线| 日韩欧美精品 | 视频一区中文字幕 | 精品国产一区二区三区在线观看 | 视频一区二区三区中文字幕 | 国产精品一卡 | 国产亚洲精品久久久 | 波多野结衣中文字幕一区二区三区 | 男女视频在线 | 日韩中文字幕在线视频 | 欧美日韩一区二区视频在线观看 | 亚洲成人一区 | 久草中文在线 | 午夜在线| 日韩在线观看一区 | 欧美视频二区 | 日韩av在线中文字幕 | 成人久久久精品国产乱码一区二区 | 欧州一级片 | 久草精品在线 | 日本成人黄色网址 | 中文字幕精品一区二区三区精品 | 国产精品日韩精品 | 日韩精品在线观 | www.中文字幕| 欧美电影网站 | 久日av | 九九九视频 | 91久久精品国产91久久 |