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

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

Java的Iterator和Collection實現類的關系

Java的Iterator和Collection實現類的關系

鳳凰求蠱 2019-02-18 12:12:28
Java的Iterator和Collection實現類的關系
查看完整描述

2 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

用Iterator模式實現遍歷集合
Iterator模式是用于遍歷集合類的標準訪問方法。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而避免向客戶端暴露集合的內部結構。
例如,如果沒有使用Iterator,遍歷一個數組的方法是使用索引:
for(int i=0; i<array.size(); i++) { ... get(i) ... }

而訪問一個鏈表(LinkedList)又必須使用while循環:
while((e=e.next())!=null) { ... e.data() ... }

以上兩種方法客戶端都必須事先知道集合的內部結構,訪問代碼和集合本身是緊耦合,無法將訪問邏輯從集合類和客戶端代碼中分離出來,每一種集合對應一種遍歷方法,客戶端代碼無法復用。
更恐怖的是,如果以后需要把ArrayList更換為LinkedList,則原來的客戶端代碼必須全部重寫。

為解決以上問題,Iterator模式總是用同一種邏輯來遍歷集合:
for(Iterator it = c.iterater(); it.hasNext(); ) { ... }

奧秘在于客戶端自身不維護遍歷集合的"指針",所有的內部狀態(如當前元素位置,是否有下一個元素)都由Iterator來維護,而這個Iterator由集合類通過工廠方法生成,因此,它知道如何遍歷整個集合。
客戶端從不直接和集合類打交道,它總是控制Iterator,向它發送"向前","向后","取當前元素"的命令,就可以間接遍歷整個集合。
首先看看java.util.Iterator接口的定義:
public interface Iterator { boolean hasNext(); Object next(); void remove(); }

依賴前兩個方法就能完成遍歷,典型的代碼如下:
for(Iterator it = c.iterator(); it.hasNext(); ) { Object o = it.next(); // 對o的操作... }

在JDK1.5中,還對上面的代碼在語法上作了簡化(但是限于只讀,如果需要remove,還是直接使用iterator):
// Type是具體的類型,如String。 for(Type t : c) { // 對t的操作... }

每一種集合類返回的Iterator具體類型可能不同,Array可能返回ArrayIterator,Set可能返回
SetIterator,Tree可能返回TreeIterator,但是它們都實現了Iterator接口,因此,客戶端不關心到底是哪種
Iterator,它只需要獲得這個Iterator接口即可,這就是面向對象的威力。



查看完整回答
反對 回復 2019-03-02
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

public interface Inteator {

    boolean hasNext();

    Object next(); 

}

 

public interface Iterable {

    Iterator iterator();

}

 

public interface Collection extends Iterable {

    Iterator iterator();

}

 

public interface List extends Collection {

    Iterator iterator();

}

 

public class ArrayList implements List {

    public Iterator iterator() {

        return new Itr();

    }

     

    private class Itr implements Iterator {

        public boolean hasNext() {}

        public Object next(){} 

    }

}

 

 

Collection c = new ArrayList();

c.add("hello");

c.add("world");

c.add("java");

Iterator it = c.iterator();     //new Itr();

while(it.hasNext()) {

    String s = (String)it.next();

    System.out.println(s);

}


 


查看完整回答
反對 回復 2019-03-02
  • 2 回答
  • 0 關注
  • 915 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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