1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Java集合-Iterator

        共 7966字,需瀏覽 16分鐘

         ·

        2021-03-13 11:02

        點(diǎn)擊關(guān)注,與你共同成長(zhǎng)!



        Java集合-Iterator

        Java Iterator接口表示一個(gè)對(duì)象,該對(duì)象能夠遍歷Java對(duì)象的集合,一次迭代一個(gè)對(duì)象。Iterator 接口是Java中用于迭代對(duì)象集合的最古老的機(jī)制之一(盡管不是最早的-Enumerator 早于Iterator )。

        使用java的Iterator ,首先從需要迭代的對(duì)象集合中獲取一個(gè)Iterator 實(shí)例。獲得的迭代器跟蹤底層集合中的元素,以確保遍歷所有元素。如果在遍歷指向該集合的迭代器時(shí),修改基礎(chǔ)集合,迭代器通常會(huì)檢測(cè)到它,并在下次嘗試從迭代器獲取下一個(gè)元素時(shí)拋出異常。下面會(huì)繼續(xù)講述。

        Iterator核心方法

        Iterator接口非常簡(jiǎn)單,下面是核心方法:

        方法

        說(shuō)明

        hasNext()

        如果Iterator還有元素則返回true,否則返回false

        next()

        返回Iterator的下一個(gè)元素

        remove()

        從Iterator代的集合中移除next()返回的最新元素。

        forEachRemaining()

        迭代Iterator中所有剩余的元素,并調(diào)用一個(gè)Lambda表達(dá)式,將剩余的每個(gè)元素作為參數(shù)傳遞給Lambda表達(dá)式。

        獲取Iterator

        通常情況下,將通過(guò)從包含多個(gè)嵌套對(duì)象的Java對(duì)象獲取迭代器來(lái)與它交互。標(biāo)準(zhǔn)的java集合接口Collection 包含一個(gè)iterator()方法,調(diào)用iterator()方法可以從Collection中獲取一個(gè)迭代器??梢詮膉ava集合各個(gè)數(shù)據(jù)結(jié)構(gòu)中獲取Iterator 例如, List, Set, Map, Queue, Deque或者 Map。下面是從各個(gè)集合中獲取Iterator 的例子:

        List<String> list = new ArrayList<>();
        list.add("one");
        list.add("two");
        list.add("three");
         
        Iterator<String> iterator = list.iterator();
        Set<String> set = new HashSet<>();
        set.add("one");
        set.add("two");
        set.add("three");
         
        Iterator<String> iterator2 = set.iterator();

        迭代Iterator

        可以用while 循環(huán)迭代Iterator ,下面是例子:

        Iterator iterator = list.iterator();
         
        while(iterator.hasNext()) {
            Object nextObject = iterator.next();
         
        }

        上面的例子使用了Iterator 的兩個(gè)方法,第一個(gè) hasNext(),如果Iterator 還有元素則返回true。換句話說(shuō),如果迭代器還沒(méi)有遍歷從中獲取迭代器的集合中的所有元素,hasNext()方法將返回true。如果迭代器迭代了底層集合中的所有元素,hasNext()方法返回false。

        第二個(gè)方法是next(),next()返回Iterator 的下一個(gè)元素。

        迭代順序

        Iterator的順序取決于迭代的集合,例如從List中獲取的Iterator ,則元素的存儲(chǔ)順序與List中的元素引用,另一方面,從Set中獲得的迭代器并不保證集合中元素的精確迭代順序。

        List的Iterator

        下面是從List 實(shí)例中獲取Iterator :

        List list = new ArrayList();
         
        list.add("123");
        list.add("456");
        list.add("789");
         
        Iterator iterator = list.iterator();

        Set的Iterator

        下面是從Set中獲取Iterator 實(shí)例:

        Set set = new HashSet();
         
        set.add("123");
        set.add("456");
        set.add("789");
         
        Iterator iterator = set.iterator();

        迭代時(shí)修改集合

        有些集合使用Iterator 迭代時(shí)不允許修改集合,否則在迭代器下一次調(diào)用next()方法時(shí),會(huì)拋ConcurrentModificationException ,下面是例子:

        package cn.com.codingce.collection;
         
         
         
        import java.util.ArrayList;
         
        import java.util.Iterator;
         
        import java.util.List;
         
         
         
        public class IteratorTest {
         
         
         
            public static void main(String[] args) {
         
                List<String> list = new ArrayList<>();
         
         
         
                list.add("123");
         
                list.add("456");
         
                list.add("789");
         
         
         
                Iterator<String> iterator = list.iterator();
         
         
         
                while(iterator.hasNext()) {
         
                    String value = iterator.next();
         
         
         
                    if(value.equals("456")){
         
                        list.add("999");
         
                    }
         
                }
         
            }
         
        }

        執(zhí)行結(jié)果:

        Exception in thread "main" java.util.ConcurrentModificationException
         
            at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
         
            at java.util.ArrayList$Itr.next(Unknown Source)
         
            at com.ck.collection.IteratorTest.main(IteratorTest.java:19)

        如果通過(guò)Iterator迭代集合的同時(shí)修改了集合,則會(huì)引發(fā)ConcurrentModificationException,因?yàn)榈髋c集合不同步。

        迭代時(shí)移除元素

        Java迭代器接口有一個(gè)remove()方法,可以從底層集合中移除next()剛剛返回的元素,調(diào)用remove()方法不會(huì)拋ConcurrentModificationException 異常,下面是代碼:

        List<String> list = new ArrayList<>();
         
        list.add("123");
        list.add("456");
        list.add("789");
         
        Iterator<String> iterator = list.iterator();
         
        while(iterator.hasNext()) {
            String value = iterator.next();
         
            if(value.equals("456")){
                iterator.remove();
            }
        }

        forEachRemaining()

        forEachRemaining()方法,可以迭代Iterator內(nèi)部剩余的元素,對(duì)于每個(gè)元素,調(diào)用作為參數(shù)傳遞給forEachRemaining()的Lambda表達(dá)式,下面是代碼:

        List<String> list = new ArrayList<>();
        list.add("Jane");
        list.add("Heidi");
        list.add("Hannah");
         
        Iterator<String> iterator = list.iterator();
                
        iterator.forEachRemaining((element) -> {
            System.out.println(element);
        });

        ListIterator

        Java 還有一個(gè)接口ListIterator繼承了Iterator接口,ListIterator接口,它表示一個(gè)雙向迭代器,意味著可以向前和向后迭代元素的迭代器。

        這兒不詳細(xì)講解,用一個(gè)例子說(shuō)明怎么使用:

        List<String> list = new ArrayList<>();
        list.add("Jane");
        list.add("Heidi");
        list.add("Hannah");
         
        ListIterator<String> listIterator = list.listIterator();
                
        while(listIterator.hasNext()) {
            System.out.println(listIterator.next());
        }
                
        while(listIterator.hasPrevious()) {
            System.out.println(listIterator.previous());
        }

        上面可以看到,第一個(gè)例子ListIterator向后迭代,第二個(gè)例子向前迭代。

        實(shí)現(xiàn)Iterator接口

        如果有一個(gè)特殊的、定制的集合類型,那么可以自己實(shí)現(xiàn)Iterator接口來(lái)創(chuàng)建一個(gè)迭代器,該迭代器可以遍歷自定義集合的元素。在本節(jié)中,將展示一個(gè)超簡(jiǎn)單的Java迭代器接口的定制實(shí)現(xiàn),將了解實(shí)現(xiàn)迭代器接口的外觀。將為其實(shí)現(xiàn)迭代器的集合是一個(gè)標(biāo)準(zhǔn)的List,它不是一個(gè)完全完美的實(shí)現(xiàn),因?yàn)樗荒茉诘陂g檢測(cè)到列表內(nèi)容的更改,但是它足以讓您了解迭代器實(shí)現(xiàn)的外觀,下面是代碼:

        import java.util.Iterator;
        import java.util.List;
         
        public class ListIterator <Timplements Iterator<T{
         
            private List<T> source = null;
            private int index = 0;
         
            public ListIterator(List<T> source){
                this.source = source;
            }
         
         
            @Override
            public boolean hasNext() {
                return this.index < this.source.size();
            }
         
            @Override
            public T next() {
                return this.source.get(this.index++);
            }
         
        }

        下面是一個(gè)在上面的ListIterator的迭代過(guò)程中它的外觀的示例:

        import java.util.ArrayList;
        import java.util.List;
         
        public class ListIteratorExample {
         
            public static void main(String[] args) {
                List<String> list = new ArrayList();
         
                list.add("one");
                list.add("two");
                list.add("three");
         
                ListIterator<String> iterator = new ListIterator<>(list);
                while(iterator.hasNext()) {
                    System.out.println( iterator.next() );
                }
         
            }
        }


        Java集合-Map

        Java集合-Deque

        Java集合-Stack 


        以上,便是今天的分享,希望大家喜歡,覺(jué)得內(nèi)容不錯(cuò)的,歡迎「分享」「」或者點(diǎn)擊「在看」支持,謝謝各位。

        瀏覽 42
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91在线精品秘 一区二区18 | 交1300合集欧美成人性 | 亚洲免费小黄片 | 操操逼逼视频网站 | 97成人人妻一区二区三区 | 国产第99页 | 麻豆av免费观看 扒下她的小内裤揉弄在线观看视频 | 黄色片快播 | 中文字幕一区二区三区人妻电影 | 日韩成人一区二区三区影院AV |