日韩精品欧美激情国产一区_中文无码精品一区二区三区在线_岛国毛片AV在线无码不卡_亞洲歐美日韓精品在線_使劲操好爽好粗视频在线播放_日韩一区欧美二区_八戒八戒网影院在线观看神马_亚洲怡红院在线色网_av无码不卡亚洲电影_国产麻豆媒体MDX

java迭代器

時(shí)間:2020-05-12 16:46:15 類(lèi)型:JAVA
字號(hào):    

迭代器

不同java集合(容器)的內(nèi)部結(jié)構(gòu)是不一樣的,如果為每種容器都單獨(dú)實(shí)現(xiàn)一種遍歷方法十分麻煩,為了簡(jiǎn)化遍歷容器的操作,所以推出了java迭代器(Iterator)

通過(guò)java迭代器,我們可以用統(tǒng)一的方法實(shí)現(xiàn)對(duì)容器的遍歷,極大地簡(jiǎn)化了操作.

迭代器接口

1.java.util.Iterator接口

public interface Iterator<E> {
    //查詢(xún)?nèi)萜髦惺欠翊嬖谙乱粋€(gè)元素
    boolean hasNext();
    //返回下一個(gè)元素
    //注意 : 在一次循環(huán)中,只能用一次next(),重復(fù)調(diào)用會(huì)返回再下面的元素.
    E next();
    //把元素從容器中移除
    //注意 : 要用迭代器的remove()方法,不要用容器的remove()方法.否則會(huì)發(fā)生異常
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    //1.8新增默認(rèn)方法,以后再講
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

2.java.util.Iterable

public interface Iterable<T> {
    //容器可以通過(guò)此方法,返回該容器的迭代器.
    Iterator<T> iterator();
    //1.8新增,先不講
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
    //1.8新增,先不講
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}  

Collection<E>接口繼承了Iterable<T>接口,而Iterable接口含有iterator()方法,所以 : 

  所有繼承自Collection<E>的容器,都實(shí)現(xiàn)了iterator()方法,從而通過(guò)此方法獲得各自容器的迭代器!

如何使用迭代器遍歷集合

List<String> list =new ArrayList<String>();
//給list添加元素的過(guò)程省略......
Iterator<String> listIterator = list.iterator();
while(listIterator.hasNext()) {
    //一次循環(huán)中只能調(diào)用一次next()方法!否則循環(huán)就亂套了!
    //因?yàn)槊看握{(diào)用next()都會(huì)獲取下一個(gè)元素.
    String next = listIterator.next();
    if("bingo".equals(next)) {
    //只能通過(guò)迭代器刪除元素,用集合的remove()方法會(huì)發(fā)生異常!
    listIterator.remove();
    //?這是錯(cuò)誤方法?
    //list.remove(next);
    }else {
        System.out.println(next);
     }
}
System.out.println(list);

如果遍歷的是Map,那么用Map的entrySet()方法獲得Set<Entry<K, V>>,通過(guò)Set來(lái)獲取迭代器!(Map.Entry是一個(gè)鍵值對(duì))

//Map通過(guò)entrySet()方法獲取Set,再獲取Set的迭代器
Iterator<Entry<Integer, String>> iterator =map.entrySet().iterator();
//之后的操作同上.

用Map.Entry的getKey()方法獲取鍵,getValue()方法獲取值.

ListIterator和Iterator的區(qū)別

迭代List集合時(shí),推薦使用ListIterator

  1. iterator()方法在set和list接口中都有定義,但是ListIterator()僅存在于list接口中(或?qū)崿F(xiàn)類(lèi)中);

  2. ListIterator有add()方法,可以向List中添加對(duì)象,而Iterator不能

  3. ListIterator和Iterator都有hasNext()和next()方法,可以實(shí)現(xiàn)順序向后遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實(shí)現(xiàn)逆向(順序向前)遍歷。Iterator就不可以。

  4. ListIterator可以定位當(dāng)前的索引位置,nextIndex()和previousIndex()可以實(shí)現(xiàn)。Iterator沒(méi)有此功能。

  5. 都可實(shí)現(xiàn)刪除對(duì)象,但是ListIterator可以實(shí)現(xiàn)對(duì)象的修改,set()方法可以實(shí)現(xiàn)。Iierator僅能遍歷,不能修改。  

  因?yàn)長(zhǎng)istIterator的這些功能,可以實(shí)現(xiàn)對(duì)LinkedList等List數(shù)據(jù)結(jié)構(gòu)的操作。其實(shí),數(shù)組對(duì)象也可以用迭代器來(lái)實(shí)現(xiàn)。

為什么迭代器遍歷時(shí)不能用集合的remove()方法刪除元素?

  會(huì)發(fā)生異常,具體以后再寫(xiě).

for增強(qiáng)循環(huán)

for增強(qiáng)循環(huán)實(shí)際上內(nèi)部也是使用的迭代器進(jìn)行遍歷.所以for增強(qiáng)循環(huán)在遍歷集合時(shí)也不能刪除元素(用集合的remove()方法)

for循環(huán)和迭代器誰(shuí)更快?

主要看遍歷的集合的數(shù)據(jù)結(jié)構(gòu)是否合適 : 

  for循環(huán)依據(jù)索引來(lái)遍歷對(duì)象,所以在隨機(jī)訪(fǎng)問(wèn)中比較快(比如ArrayList)

  迭代器的next()采用的是順序訪(fǎng)問(wèn)方法,所以在順序訪(fǎng)問(wèn)的集合中速度更快(比如LinkedList)


<