亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Java中迭代列表的方法

在Java中迭代列表的方法

呼啦一陣風 2019-06-19 15:20:02
在Java中迭代列表的方法作為Java語言的新手,我試圖熟悉所有可能迭代列表(或者可能是其他集合)的方法(或者至少是非病態的方法),以及每種方法的優缺點。給出List<E> list對象,我知道以下遍歷所有元素的方法:基本為 環路(當然,有等價物while / do while循環)// Not recommended (see below)!for (int i = 0; i < list.size(); i++) {     E element = list.get(i);     // 1 - can call methods of element     // 2 - can use 'i' to make index-based calls to methods of list     // ...}注意:正如@amarseillan所指出的,這個表單是迭代的一個糟糕的選擇。ListS的實際實現,因為get方法的效率可能不如使用Iterator..例如,LinkedList實現必須遍歷I之前的所有元素以獲得第一個元素.在上面的例子中,List實現來“保存它的位置”,以使將來的迭代更有效率。為了ArrayList這并不重要,因為get是常數時間(O(1),而對于LinkedList它是否與列表的大小成正比(O(N)。有關內建的計算復雜性的更多信息。Collections實現,請查看這個問題.增強型用于循環(解釋得很好在這個問題上)for (E element : list) {     // 1 - can call methods of element     // ...}愛爾蘭人for (Iterator<E> iter = list.iterator(); iter.hasNext(); ) {     E element = iter.next();     // 1 - can call methods of element     // 2 - can use iter.remove() to remove the current element from the list     // ...}ListIteratorfor (ListIterator<E> iter = list.listIterator(); iter.hasNext(); ) {     E element = iter.next();     // 1 - can call methods of element     // 2 - can use iter.remove() to remove the current element from the list     // 3 - can use iter.add(...) to insert a new element into the list     //     between element and iter->next()     // 4 - can use iter.set(...) to replace the current element     // ...}函數Javalist.stream().map(e -> e + 1); // Can apply a transformation function for eIterable.forEach, 為每一個人, ...(Java 8的StreamAPI中的map方法(請參閱@i_am_零的答案)。在Java 8集合類中實現Iterable(例如,所有List(S)現在有一個forEach方法,可以使用該方法來代替循環語句如上所示。(這里是另一個問題這提供了一個很好的比較。)如果有的話,還有什么其他的方法嗎?(順便說一句,我的興趣根本不是出于對優化性能我只想知道作為一名開發人員,我可以使用哪些表單。)
查看完整描述

3 回答

?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

這三種循環形式幾乎是相同的。增強for循環:

for (E element : list) {
    . . .}

是,根據Java語言規范完全相同實際上,使用傳統的迭代器可以顯式地使用迭代器。for循環。在第三種情況下,只能通過移除當前元素來修改列表內容,而且只有通過remove迭代器本身的方法。使用基于索引的迭代,您可以任意修改列表。但是,添加或刪除當前索引之前的元素可能會使您的循環跳過元素或多次處理相同的元素;在進行此類更改時,需要正確地調整循環索引。

在所有情況下,element是對實際列表元素的引用。沒有一個迭代方法會復制列表中的任何內容。的內部狀態的更改。element將始終顯示在列表中相應元素的內部狀態。

本質上,迭代列表的方法只有兩種:使用索引或使用迭代器。增強型for循環只是Java 5中引入的一種語法快捷方式,以避免顯式定義迭代器的繁瑣。對于這兩種樣式,您可以使用forwhiledo while積木,但它們都歸結為同一件事情(或者說,更確切地說,是兩件事)。

編輯:正如@iX3在注釋中指出的那樣,您可以使用ListIterator若要在迭代時設置列表的當前元素,請執行以下操作。你需要用List#listIterator()而不是List#iterator()初始化循環變量(顯然,必須將其聲明為ListIterator而不是Iterator).


查看完整回答
反對 回復 2019-06-19
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

不建議使用基本循環,因為您不知道列表的實現。

如果這是LinkedList的話,每個電話

list.get(i)

將對列表進行迭代,從而導致N^2時間復雜度。


查看完整回答
反對 回復 2019-06-19
  • 3 回答
  • 0 關注
  • 611 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號