Java 集合中關于Iterator 和ListIterator的詳解

1.Iterator

Iterator的定義如下:

public interface Iterator<E> {}

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


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

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

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

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

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

我們來驗證一下:

注意:

(1)Iterator只能單向移動。

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


2.ListIterator

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

我們先來看一段關于ListIterator的描述:


ListIterator接口定義如下:

????Interface ListIterator<E>{}

包含的方法有:

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

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

(2)產生相對于迭代器在列表中指向的當前位置的前一個和后一個元素的索引.

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

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

使用例子:
import java.util.*;
public class TestListIterator{public static void main(String[] args) {1       ArrayList<String> a = new ArrayList<String>();2       a.add("aaa");3       a.add("bbb");4       a.add("ccc");5       System.out.println("Before iterate : " + a);6       ListIterator<String> it = a.listIterator()7       while (it.hasNext()) {8           System.out.println(it.next() + ", " + it.previousIndex() + ", " + it.nextIndex());9       }
10        while (it.hasPrevious()) {
11            System.out.print(it.previous() + " ");
12        }
13        System.out.println();
14        it = a.listIterator(1);//調用listIterator(n)方法創建一個一開始就指向列表索引為n的元素處的ListIterator。
15        while (it.hasNext()) {
16            String t = it.next();
17            System.out.println(t);
18            if ("ccc".equals(t)) {
19                it.set("nnn");
20            } else {
21                it.add("kkk");
22            }
23        }
24        System.out.println("After iterate : " + a);}
}
解釋:

第1行:新建一個ArrayList,命名為a;

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

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

第6行:調用了a的listIterator方法,并使ListIterator類型的it指向,也就是說ListIterator類型的it指向了ArrayList容器,?通過調用ArrayList的listIterator方法來進行容器內的遍歷。

第7行、8、9行,調用it的hasNext()方法進行判斷容器中是否還有元素,如果有,則輸出元素,當前元素前一個元素的索引,當前元素后一個元素的索引,

所以會輸出:

aaa,0,1? ??

bbb,1,2?

ccc,2,3

第10行,此時,it已經指向了ArrayList的最后一個元素,在這里調用了ListIterator的hasPrevious()方法,就是,開始往前遍歷(上面是往后遍歷) 在這個while循環中,會以此輸出:ccc bbb? aaa。

第13行:輸出換行。

第14行:現在it應該已經再一次指向ArrayList的開頭。在這一行中,it又被用到了,同樣的用到了ArrayList的listIteror方法,這一次不同,而是it指向了listIteror的第二個元素,因為是1,第一個元素的索引是0,也就是說it指向了ArrayList里的bbb。bbb是開頭的元素。

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

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

第17行:輸出bbb

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

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

我們來驗證一下:

Iterator和ListIterator區別

我們在使用List,Set的時候,為了實現對其數據的遍歷,我們經常使用到了Iterator(迭代器)。使用迭代器,你不需要干涉其遍歷的過程,只需要每次取出一個你想要的數據進行處理就可以了。但是在使用的時候也是有不同的。List和Set都有iterator()來取得其迭代器。對List來說,你也可以通過listIterator()取得其迭代器,兩種迭代器在有些時候是不能通用的,Iterator和ListIterator主要區別在以下方面:

(1)ListIterator有add()方法,可以向List中添加對象,而Iterator不能
(2)ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向后遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator就不可以。
(3)ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現。Iterator沒有此功能。
(4)都可實現刪除對象,但是ListIterator可以實現對象的修改,set()方法可以實現。Iierator僅能遍歷,不能修改。

因為ListIterator的這些功能,可以實現對LinkedList等List數據結構的操作。其實,數組對象也可以用迭代器來實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274062.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274062.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274062.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用xrandr和cvt命令添加自定義的分辨率模式

可以使用xrandr -q命令查看當前支持的分辨率模式: 如果過沒有你想要的分辨率模式,則需要自己創建新的分辨率模式,例如,我想要創建800x750的分辨率模式,步驟如下: 1.使用cvt命令創建新的分辨率: 2.使用xrandr –newmode modeline信息(CVT命令產生的結果)創建新的mode: $xra…

Java List集合

我們先看一下jdk1.9對其的描述&#xff1a;什么是List&#xff0c;也就是一個有序集合(序列)。1.List接口 List集合代表一個有序集合&#xff0c;集合中每個元素都有其對應的順序索引。List集合允許使用重復元素&#xff0c;可以通過索引來訪問指定位置的集合元素。 List接口繼…

winform錯誤提示 :窗口類名無效(Window class name is not valid)

winfrom 程序在 xp 操作系統上報錯提示 窗口類名無效(Window class name is not valid) 解決方法 注釋 Program類 里 這句 Application.EnableVisualStyles(); 解決轉載于:https://www.cnblogs.com/z_lb/p/3288850.html

如何在linux下通過ssh運行X圖形軟件

服務器端&#xff1a;編輯/etc/ssh/sshd_config中的以下內容 啟用AllowTcpForwarding 啟用X11Forwarding 將X11DisplayOffset設定為10. 啟用X11UseLocalhost 客戶機端&#xff1a;編輯/etc/ssh/ssh_config中的以下內容 啟用X11Forwarding 連接時ssh -X或者ssh -Y就可以了…

Java Set集合

Set接口什么是Set&#xff0c;就是不包含重復元素的集合。Set是一種不包括重復元素的Collection。它維持它自己的內部排序&#xff0c;所以隨機訪問沒有任何意義。與List一樣&#xff0c;它同樣允許null的存在但是僅有一個。由于Set接口的特殊性&#xff0c;所有傳入Set集合中的…

linux下制作win7安裝U盤

轉自:http://blog.csdn.net/pipisorry/article/details/41369821 http://blog.csdn.net/pipisorry/article/details/41369821 已裝Linux&#xff0c;再用U盤安裝win7(網絡安裝應該也可以)&#xff0c; 先要在linux里面制作一個win7安裝U盤&#xff08;windows下用ultraiso制…

Java Map集合

Map集合&#xff1a;Map接口Map與List、Set接口不同&#xff0c;它是由一系列鍵值對組成的集合&#xff0c;提供了key到Value的映射。同時它也沒有繼承Collection。在Map中它保證了key與value之間的一一對應關系。也就是說一個key對應一個value&#xff0c;所以它不能存在相同的…

gsettings命令使用簡介

1.gsettings創建項 應用程序可以使用gsettings來保存配置信息&#xff0c;可以通過代碼在程序中進行設置、修改gsettings的已有的項&#xff0c;但是不能通過程序代碼創建新的gsettings項&#xff0c;gsettings的項的在一個叫做schema的規范文件中創建&#xff0c;schema文檔其…

Collection 和 Collections區別

Collection 和 Collections區別&#xff08;1&#xff09;java.util.Collection 是一個集合接口&#xff08;集合類的一個頂級接口&#xff09;。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是為各種具…

Http狀態碼完整說明

在網站建設的實際應用中&#xff0c;容易出現很多小小的失誤&#xff0c;就像mysql當初優化不到位&#xff0c;影響整體網站的瀏覽效果一樣&#xff0c;其實&#xff0c;網站的常規http狀態碼的表現也是一樣&#xff0c; 一些常見的狀態碼為&#xff1a; 200 - 服務器成功返回網…

運用xlib進行事件響應(X11 API)的小例子

轉自&#xff1a;http://blog.csdn.net/linuxheik/article/details/7659090 File: x11_test.cxx #include <X11/Xlib.h> 每一個Xlib 程序都必須包含這個頭文件 #include <stdio.h>1. int main(void) {2. Display *display XopenDisplay(NULL);首先打開與server …

Java 之HashSet、LinkedHashSet、TreeSet比較

4.HashSet、LinkedHashSet、TreeSet比較 Set接口Set不允許包含相同的元素&#xff0c;如果試圖把兩個相同元素加入同一個集合中&#xff0c;add方法返回false。Set判斷兩個對象相同不是使用運算符&#xff0c;而是根據equals方法。也就是說&#xff0c;只要兩個對象用equals方法…

jquery1.9學習筆記 之選擇器(基本元素四)

ID選擇器("#id") 描述&#xff1a; 選擇與給出ID屬性匹配的單元標簽。 對于ID選擇器&#xff0c;jquery使用JS的函數document.getElementById()&#xff0c;當一個標簽附加到ID選擇器上時&#xff0c;也是非常有效的。如h2#pageTitle&#xff0c;jquery會在識別元素標…

Java(ArrayList和LinkedList)、(HashTable與HashMap)、(HashMap、Hashtable、LinkedHashMap和TreeMap比較)

1.ArrayList和LinkedList &#xff08;1&#xff09;ArrayList是實現了基于動態數組的數據結構&#xff0c;LinkedList基于鏈表的數據結構。 &#xff08;2&#xff09;對于隨機訪問get和set&#xff0c;ArrayList絕對優于LinkedList&#xff0c;因為LinkedList要移動指針。 &a…

oracle 事務測試

此文章是根據官方改變 模擬帳戶轉賬流程1.JOHN帳戶扣除-DAVID帳戶增加-記錄日志&#xff0d;事務提交三個操作必須全部完成此事務才完成&#xff0c;否則失敗創建帳戶余額表自增字段自增序列&#xff1b;createsequencesaving_seqincrementby1startwith1maxvalue99999999999999…

apt-get 獲取源碼的方法

apt-get source gconf-editor –allow-unauthenticated 注&#xff1a;gconf-editor是一個包名&#xff0c;根據自己的需求相應更改即可

Java 集合之自動打包和解包以及泛型

自動打包與解包&#xff1a;泛型&#xff1a;上栗子&#xff1a; TestMap1.java: package com.zhj.www; import java.util.*;public class TestMap {public static void main(String[] args) {Map m1 new HashMap();Map m2 new TreeMap();//m1.put("one", new Inte…

select * from dim.dim_area_no@to_dw

應該是建的有database linksdim是用戶名&#xff0c;dim_area_no是表名&#xff0c;to_dw 是建的database links的名&#xff0c;dim_area_no表屬于dim用戶創建database links的作用是連接其他數據庫的表select * from dim.dim_area_noto_dw 這個語句的作用是查詢屬于dim用戶的…

ios 內存管理 心得

- alloc, copy, retain會把引用計數1 - release會把引用計數-1 - 局部變量如果初始化時不是autorelease的&#xff0c;要及時調用release釋放&#xff0c;并且賦值為nil否則引用仍然存在導致下次無法用nil做是否有值的判斷 - 實例變量要在每次賦值時要先釋放當前引用的對象再賦…

error while loading shared libraries: xxx.so.x 錯誤的原因和解決辦法

一般我們在Linux下執行某些外部程序的時候可能會提示找不到共享庫的錯誤, 比如: tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory 原因一般有兩個, 一個是操作系統里確實沒有包含該共享庫(lib*.…