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

Java 集合中關(guān)于Iterator和ListIterator的用法說明

 更新時(shí)間:2020年12月03日 10:12:00   作者:沒考上研究生的張同學(xué)  
這篇文章主要介紹了Java 集合中關(guān)于Iterator和ListIterator的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

1.Iterator

Iterator的定義如下:

public interface Iterator<E> {}

Iterator是一個(gè)接口,它是集合的迭代器。集合可以通過Iterator去遍歷集合中的元素。Iterator提供的API接口如下:

forEachRemaining(Consumer<? super E> action):為每個(gè)剩余元素執(zhí)行給定的操作,直到所有的元素都已經(jīng)被處理或行動(dòng)將拋出一個(gè)異常

hasNext():如果迭代器中還有元素,則返回true。

next():返回迭代器中的下一個(gè)元素

remove():刪除迭代器新返回的元素。

例子:

import java.util.*;
public class TestIterator {
 public static void main(String[] args) {
  ArrayList<String> a = new ArrayList<String>();
  a.add("aaa");
  a.add("bbb");
  a.add("ccc");
  System.out.println("Before iterate : " + a);
  Iterator<String> it = a.iterator();
  while (it.hasNext()) {
   String t = it.next();
   if ("bbb".equals(t)) {
    it.remove();
   }
  }
  System.out.println("After iterate : " + a);
 }
}

我們可以看到:首先往一個(gè)ArrayList里裝了aaa,bbb,ccc,然后進(jìn)行判斷刪除bbb,最后ArrayList里只剩 aaa,ccc。

我們來驗(yàn)證一下:

注意:

(1)Iterator只能單向移動(dòng)。

(2)Iterator.remove()是唯一安全的方式來在迭代過程中修改集合;如果在迭代過程中以任何其它的方式修改了基本集合將會(huì)產(chǎn)生未知的行為。而且每調(diào)用一次next()方法,remove()方法只能被調(diào)用一次,如果違反這個(gè)規(guī)則將拋出一個(gè)異常。

2.ListIterator

ListIterator是一個(gè)功能更加強(qiáng)大的, 它繼承于Iterator接口,只能用于各種List類型的訪問。可以通過調(diào)用listIterator()方法產(chǎn)生一個(gè)指向List開始處的ListIterator, 還可以調(diào)用listIterator(n)方法創(chuàng)建一個(gè)一開始就指向列表索引為n的元素處的ListIterator。

我們先來看一段關(guān)于ListIterator的描述:

ListIterator接口定義如下:

Interface ListIterator<E>{}

包含的方法有:

由以上定義我們可以推出ListIterator可以:

(1)雙向移動(dòng)(向前/向后遍歷).

(2)產(chǎn)生相對(duì)于迭代器在列表中指向的當(dāng)前位置的前一個(gè)和后一個(gè)元素的索引.

(3)可以使用set()方法替換它訪問過的最后一個(gè)元素.

(4)可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一個(gè)元素.

使用例子:

import java.util.*;
public class TestListIterator{

 public static void main(String[] args) {
  ArrayList<String> a = new ArrayList<String>();
  a.add("aaa");
  a.add("bbb");
  a.add("ccc");
  System.out.println("Before iterate : " + a);
  ListIterator<String> it = a.listIterator()
  while (it.hasNext()) {
   System.out.println(it.next() + ", " + it.previousIndex() + ", " + it.nextIndex());
  }
  while (it.hasPrevious()) {
   System.out.print(it.previous() + " ");
  }
  System.out.println();
  it = a.listIterator(1);//調(diào)用listIterator(n)方法創(chuàng)建一個(gè)一開始就指向列表索引為n的元素處的ListIterator。
  while (it.hasNext()) {
   String t = it.next();
   System.out.println(t);
   if ("ccc".equals(t)) {
    it.set("nnn");
   } else {
    it.add("kkk");
   }
  }
  System.out.println("After iterate : " + a);
 }
}

解釋:

第1行:新建一個(gè)ArrayList,命名為a;

第2行、第3行和第4行分別一次往ArrayList里添加了aaa,bbb,ccc;

第5行:輸出ArrayList里的值:aaa,bbb,ccc

第6行:調(diào)用了a的listIterator方法,并使ListIterator類型的it指向,也就是說ListIterator類型的it指向了ArrayList容器, 通過調(diào)用ArrayList的listIterator方法來進(jìn)行容器內(nèi)的遍歷。

第7行、8、9行,調(diào)用it的hasNext()方法進(jìn)行判斷容器中是否還有元素,如果有,則輸出元素,當(dāng)前元素前一個(gè)元素的索引,當(dāng)前元素后一個(gè)元素的索引,

所以會(huì)輸出:

aaa,0,1

bbb,1,2

ccc,2,3

第10行,此時(shí),it已經(jīng)指向了ArrayList的最后一個(gè)元素,在這里調(diào)用了ListIterator的hasPrevious()方法,就是,開始往前遍歷(上面是往后遍歷) 在這個(gè)while循環(huán)中,會(huì)以此輸出:ccc bbb aaa。

第13行:輸出換行。

第14行:現(xiàn)在it應(yīng)該已經(jīng)再一次指向ArrayList的開頭。在這一行中,it又被用到了,同樣的用到了ArrayList的listIteror方法,這一次不同,而是it指向了listIteror的第二個(gè)元素,因?yàn)槭?,第一個(gè)元素的索引是0,也就是說it指向了ArrayList里的bbb。bbb是開頭的元素。

第15行:再一次是調(diào)用了ListIterator的hasnext()方法,來判斷ArrayList里是否還有元素。

第16行:調(diào)用了it的next()方法,所謂next方法,是指找到剩下元素的第一個(gè)元素,也就是bbb,并把它賦值了String 的 t;

第17行:輸出bbb

第18行:19、20,21行,如果bbb與ccc相等則將bbb set成nnn,否則,add()來添加kkk,那么在哪里添加呢,是在next方法返回的元素之前,next方法返回的元素是ccc,也就是在bbb,和ccc之間添加kkk?,F(xiàn)在容器中有aaa、bbb、kkk以及ccc。返回到第15行,再次以此往下執(zhí)行,會(huì)進(jìn)行if判斷,然后把ccc設(shè)置nnn。

第24行,最后輸出ArrayList里的元素:aaa、bbb、kkk、nnn。

我們來驗(yàn)證一下:

Iterator和ListIterator區(qū)別

我們?cè)谑褂肔ist,Set的時(shí)候,為了實(shí)現(xiàn)對(duì)其數(shù)據(jù)的遍歷,我們經(jīng)常使用到了Iterator(迭代器)。使用迭代器,你不需要干涉其遍歷的過程,只需要每次取出一個(gè)你想要的數(shù)據(jù)進(jìn)行處理就可以了。但是在使用的時(shí)候也是有不同的。List和Set都有iterator()來取得其迭代器。

對(duì)List來說,你也可以通過listIterator()取得其迭代器,兩種迭代器在有些時(shí)候是不能通用的,Iterator和ListIterator主要區(qū)別在以下方面:

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

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

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

(4)都可實(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ì)象也可以用迭代器來實(shí)現(xiàn)。

以上這篇Java 集合中關(guān)于Iterator和ListIterator的用法說明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解析JPA的視圖查詢問題

    解析JPA的視圖查詢問題

    這篇文章主要是對(duì)JPA的視圖查詢問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-12-12
  • Java java.sql.Timestamp時(shí)間戳案例詳解

    Java java.sql.Timestamp時(shí)間戳案例詳解

    這篇文章主要介紹了Java java.sql.Timestamp時(shí)間戳案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java解析使用JSON的多種方法

    Java解析使用JSON的多種方法

    使用JSON作為數(shù)據(jù)傳輸,在瀏覽器端非常方便。JSON去除了所有JavaScript執(zhí)行代碼,只保留對(duì)象格式,而且JSON天生適合JavaScript處理,所以,絕大多數(shù)REST?API都選擇JSON作為數(shù)據(jù)傳輸格式?,F(xiàn)在問題來了:使用Java如何對(duì)JSON進(jìn)行讀寫?
    2022-12-12
  • 詳解Spring Boot中MyBatis的使用方法

    詳解Spring Boot中MyBatis的使用方法

    mybatis初期使用比較麻煩,需要各種配置文件、實(shí)體類、dao層映射關(guān)聯(lián)、還有一大推其它配置。當(dāng)然mybatis也發(fā)現(xiàn)了這種弊端。下面通過本文給大家詳細(xì)介紹Spring Boot中MyBatis的使用方法,感興趣的朋友一起看看吧
    2017-07-07
  • Spring Cloud調(diào)用Ribbon的步驟

    Spring Cloud調(diào)用Ribbon的步驟

    Ribbon是Netflix發(fā)布的開源項(xiàng)目,主要功能是提供客戶端的軟件負(fù)載均衡算法和服務(wù)調(diào)用。本文將講述Spring Cloud調(diào)用Ribbon的方法
    2021-05-05
  • 詳解Java中的防抖和節(jié)流

    詳解Java中的防抖和節(jié)流

    防抖是將多次執(zhí)行變?yōu)橹付〞r(shí)間內(nèi)不在觸發(fā)之后,執(zhí)行一次。節(jié)流是將多次執(zhí)行變?yōu)橹付〞r(shí)間不論觸發(fā)多少次,時(shí)間一到就執(zhí)行一次。這篇文章來和大家聊聊Java中的防抖和節(jié)流,感興趣的可以了解一下
    2022-08-08
  • java JDBC系列教程之JDBC類的簡(jiǎn)析與JDBC的基礎(chǔ)操作

    java JDBC系列教程之JDBC類的簡(jiǎn)析與JDBC的基礎(chǔ)操作

    這篇文章主要介紹了java JDBC系列教程之JDBC類的簡(jiǎn)析與JDBC的基礎(chǔ)操作,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot實(shí)現(xiàn)多租戶架構(gòu)

    SpringBoot實(shí)現(xiàn)多租戶架構(gòu)

    在SpringBoot中可以通過多數(shù)據(jù)源和動(dòng)態(tài)路由來實(shí)現(xiàn)多租戶機(jī)制,本文主要介紹了SpringBoot實(shí)現(xiàn)多租戶架構(gòu),具有一定的參考價(jià)值,感興趣的可以里哦啊接一下
    2024-03-03
  • SpringCloud容器化服務(wù)發(fā)現(xiàn)及注冊(cè)實(shí)現(xiàn)方法解析

    SpringCloud容器化服務(wù)發(fā)現(xiàn)及注冊(cè)實(shí)現(xiàn)方法解析

    這篇文章主要介紹了SpringCloud容器化服務(wù)發(fā)現(xiàn)及注冊(cè)實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot中5種高大上的yml文件讀取方式

    SpringBoot中5種高大上的yml文件讀取方式

    本文主要介紹了SpringBoot中5種高大上的yml文件讀取方式,總結(jié)一下除了@Value和@ConfigurationProperties外,還能夠通過哪些方式,來讀取yml配置文件的內(nèi)容,感興趣的可以了解一下
    2022-03-03

最新評(píng)論