欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的迭代器和foreach原理

 更新時間:2020年09月08日 11:05:55   作者:崔笑顏  
這篇文章主要介紹了Java中的迭代器和foreach原理,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下

迭代器是一種設(shè)計(jì)模式,它的定義為:提供一種方法訪問一個容器對象中的各個元素,而又不需暴露該容器對象的內(nèi)部細(xì)節(jié)。迭代器模式,就是為容器而生。

在Java中,Iterator稱為迭代器,主要用于遍歷 Collection 集合中的元素。Iterator 僅用于遍歷集合,Iterator 本身并不提供承裝對象的能力。如果需要創(chuàng)建Iterator 對象,則必須有一個被迭代的集合。Collection接口繼承了java.lang.Iterable接口,該接口有一個iterator()方法,那么所有實(shí)現(xiàn)了Collection接口的集合類都有一個iterator()方法,用以返回一個實(shí)現(xiàn)了Iterator接口的對象。并且集合對象每次調(diào)用iterator()方法都得到一個全新的迭代器對象,默認(rèn)指針(游標(biāo))都在集合的第一個元素之前。

1、Iterator接口中的常用方法

boolean hasNext():判斷集合中是否還有下一個元素
E next():返回下一個元素
void remove():刪除元素

注意:

  • 1.在調(diào)用next()方法之前必須要調(diào)用hasNext()方法進(jìn)行判斷。如果下一條記錄無效,而且又沒有調(diào)用hasNext()方法進(jìn)行判斷,那么直接調(diào)用next()方法就會拋出NoSuchElementException異常。
  • 2.Iterator可以刪除集合的元素,但是是通過迭代器對象的remove方法,不是集合對象的remove方法。
  • 3.如果還未調(diào)用next()方法或在上一次調(diào)用next()方法之后已經(jīng)調(diào)用了remove()方法,再調(diào)用remove()方法都會報(bào)IllegalStateException異常。

2.Iterator的使用方法(遍歷集合)

Collection coll=new ArrayList();
coll.add(123);
coll.add(456);
coll.add(789);
coll.add(new Person("Tom",12));

Iterator iterator = coll.iterator();
while(iterator.hasNext()){
 System.out.println(iterator.next());
}

3、Iterator的執(zhí)行原理

迭代器的執(zhí)行原理如下圖所示:

集合對象每次調(diào)用iterator()方法得到的迭代器對象,默認(rèn)指針(游標(biāo))都在集合的第一個元素之前。我們在使用迭代器時,首先會使用hasNext()方法判斷集合中是否還有下一個元素,如果有就會調(diào)用next()方法,調(diào)用next()方法分為兩個步驟:一是把當(dāng)前指針下移一位,二是將下移以后位置上的元素返回,如上圖所示。

4、增強(qiáng)for循環(huán):foreach

在Java 5.0提供了一種新的迭代訪問 Collection和數(shù)組的方法,就是foreach循環(huán)。使用foreach循環(huán)執(zhí)行遍歷操作不需獲取Collection或數(shù)組的長度,也不需要使用索引訪問元素。
使用方法如下所示:

public static void main(String[] args) {
 int[] ints={1,2,3,4};
 for (int i:ints) {
  System.out.println(i);
 }

 Collection coll = new ArrayList();
 coll.add(123);
 coll.add(456);
 coll.add(789);
 coll.add(new Person(1001, "Tom"));
 for (Object object:coll) {
  System.out.println(object);
 }
}

那么foreach循環(huán)是怎樣實(shí)現(xiàn)的呢?
下面我們來看一下上述代碼編譯后的源碼文件,如下所示:

編譯后的源碼如下:

public static void main(String[] args) {
  int[] ints = new int[]{1, 2, 3, 4};
  int[] var2 = ints;
  int var3 = ints.length;

  for(int var4 = 0; var4 < var3; ++var4) {
   int i = var2[var4];
   System.out.println(i);
  }

  Collection coll = new ArrayList();
  coll.add(123);
  coll.add(456);
  coll.add(789);
  coll.add(new Person(1001, "Tom"));
  Iterator var7 = coll.iterator();

  while(var7.hasNext()) {
   Object object = var7.next();
   System.out.println(object);
  }

 }

由編譯后的源碼可知,使用foreach循環(huán)遍歷數(shù)組時,底層仍然是通過for循環(huán)實(shí)現(xiàn)的;而遍歷集合時,底層是通過迭代器實(shí)現(xiàn)的。

以上就是Java中的迭代器和foreach原理的詳細(xì)內(nèi)容,更多關(guān)于Java 迭代器和foreach的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • IntelliJ?IDEA?2022.1.1?沒有CVS的過程分析

    IntelliJ?IDEA?2022.1.1?沒有CVS的過程分析

    這篇文章主要介紹了IntelliJ?IDEA?2022.1.1?沒有CVS的過程解析,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • spring boot jpa寫原生sql報(bào)Cannot resolve table錯誤解決方法

    spring boot jpa寫原生sql報(bào)Cannot resolve table錯誤解決方法

    在本篇文章里小編給大家整理的是關(guān)于spring boot jpa寫原生sql報(bào)Cannot resolve table錯誤的解決方法,需要的朋友學(xué)習(xí)下。
    2019-11-11
  • springmvc的文件保存方法詳解

    springmvc的文件保存方法詳解

    這篇文章主要介紹了springmvc的文件保存方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java8的default方法詳細(xì)介紹

    Java8的default方法詳細(xì)介紹

    這篇文章主要介紹了Java8的default方法,詳細(xì)介紹了什么是default方法,在多繼承時的處理等,需要的朋友可以參考下
    2014-04-04
  • java語言自行實(shí)現(xiàn)ULID過程底層原理詳解

    java語言自行實(shí)現(xiàn)ULID過程底層原理詳解

    這篇文章主要為大家介紹了java語言自行實(shí)現(xiàn)ULID過程底層原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Java編程BigDecimal用法實(shí)例分享

    Java編程BigDecimal用法實(shí)例分享

    這篇文章主要介紹了Java編程BigDecimal用法實(shí)例分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • IDEA卡在”正在解析Maven依賴項(xiàng)“的解決方法

    IDEA卡在”正在解析Maven依賴項(xiàng)“的解決方法

    在創(chuàng)建新的SpringBoot項(xiàng)目時,始終卡在"正在解析Maven依賴項(xiàng)…",本文小編給大家介紹了幾種相關(guān)的解決方案,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Java 坐標(biāo)系相互轉(zhuǎn)換方式

    Java 坐標(biāo)系相互轉(zhuǎn)換方式

    這篇文章主要介紹了Java中的坐標(biāo)系相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Hibernate之環(huán)境搭建及demo分享

    Hibernate之環(huán)境搭建及demo分享

    下面小編就為大家分享一篇Hibernate之環(huán)境搭建及demo,具有很好的參考價(jià)值,希望對大家有所幫助
    2017-11-11
  • Java設(shè)計(jì)模式中的抽象工廠模式解讀

    Java設(shè)計(jì)模式中的抽象工廠模式解讀

    這篇文章主要介紹了Java設(shè)計(jì)模式中的抽象工廠模式解讀,抽象工廠模式為創(chuàng)建一組相關(guān)或相互依賴的對象提供一個接口,而且無需指定他們的具體類,需要的朋友可以參考下
    2023-11-11

最新評論