Collection與Iterator

Prerequisites:

集合介面Interface的繼承圖如下:

img

上圖每一個都是介面Interface。

Collection介面下面有List介面與Set介面,List是可以放重覆的資料,Set不可以放重覆的資料。

List是有順序的,Set是沒有順序。

Iterator介面是集合的疊代器,用來遍歷集合。

Collection

提供以下方法,只要是實作Collection介面的子類別,都可以用以下方法。

  1. add 新增
  2. remove 刪除
  3. contains 是否在集合中?
  4. size 大小
  5. isEmpty
  6. clear
  7. addAll
  8. containsAll
  9. removeAll

add

以下程式碼中的10與true,都是基本型態,加到List時,會自動轉成包裝類別存進List中。
還可以把null加入。

1
2
3
4
5
List list = new ArrayList();
list.add(10);    // 轉成Integer
list.add(true);  // 轉成Boolean
list.add(null);  // 可以把null加入
list.add("str"); // 物件加入

remove

參數可以是要刪除的物件,也可以是要刪除的索引。

1
2
boolean remove(Object o);
E remove(int index);
1
2
3
4
5
6
List list = new ArrayList();
list.add(10);
list.add(true);
list.add("str");
list.remove(true); // 刪除的物件
list.remove(0);    // 刪除的索引

contains

集合中有沒有某個物件,有就傳回true,沒有就傳回false。

1
boolean contains(Object o);

isEmpty

判斷是否為空。

1
boolean isEmpty();

clear

刪除集合中所有資料。

addAll

加入另一個集合。

1
boolean addAll(Collection c);

程式碼

1
2
3
4
5
6
7
List list = new ArrayList();
list.add(10);
list.add(true);
list.add("str");
List list2 = new ArrayList();
list2.add("test");
list.addAll(list2);

containsAll

判斷「另一個」集合,有沒有在「目前這個」集合中,有就傳回true,沒有就傳回false。

1
2
3
4
5
6
7
8
List list = new ArrayList();
list.add(10);
list.add(true);
list.add("str");
List list2 = new ArrayList();
list2.add("test");
list.addAll(list2);
System.out.println(list.containsAll(list2));
true

iterator遍歷集合

透過iterator()方法,可以取得Iterator疊代器物件。

1
Iterator<E> iterator();

Collection介面繼承Iterator,所有的繼承Collection介面的子類別,一定會有iterator()方法。

Iterator介面有hasNext()、next()、remove()三個方法。

hasNext(): 檢查有沒有元素(element)?傳回值型態為boolean

next(): 傳回元素(element),並把指向陣列索引的變數,指向下一個索引。

1
2
3
4
5
6
7
8
9
List list = new ArrayList();
list.add(10);
list.add(true);
list.add("str");
Iterator iter = list.iterator();
while (iter.hasNext()) {
    Object obj = iter.next();
    System.out.println(obj.toString());
}

若要再重新使用疊代器,再重新取得一次iterator()。

1
iter = list.iterator();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
List list = new ArrayList();
list.add(10);
list.add(true);
list.add("str");
Iterator iter = list.iterator();
while (iter.hasNext()) {
  Object obj = iter.next();
  System.out.println(obj.toString());
}
iter = list.iterator();
while (iter.hasNext()) {
  Object obj = iter.next();
  System.out.println(obj.toString());
}
10
true
str
10
true
str

增強式for迴圈

實際上原始碼也是使用Iterator,但使用for讓使用者更方便。
把集合中每一個元素取出來,放在變數中。
語法

for (元素的類別 變數 : 集合) {
  // 要執行的程式碼
}
1
2
3
4
5
6
7
List list = new ArrayList();
list.add(10);
list.add(true);
list.add("str");
for (Object o : list) {
  System.out.println(o.toString());
}

增強式for迴圈的原始碼

  • Debug 可以在for 前面加上中斷點,Debug執行。
    1.step into,就會進到JDK原始碼。
1
2
for (Object o : list) {
}

原始碼中,會進到以下程式碼,建立Itr(),證明增強式for迴圈,實際上是使用Iterator。

1
2
3
    public Iterator<E> iterator() {
        return new Itr();
    }

2.step Out離開iterator()方法。
3.setp Into
4.接著進入hasNext()方法

1
2
3
public boolean hasNext() {
    return cursor != size;
}

5.step Out離開hasNext()方法。
6.setp Into
7.接著進入next()方法

1
2
3
4
5
6
7
8
9
10
11
public E next() {
    checkForComodification();
    int i = cursor;
    if (i >= size)
        throw new NoSuchElementException();
    Object[] elementData = ArrayList.this.elementData;
    if (i >= elementData.length)
        throw new ConcurrentModificationException();
    cursor = i + 1;
    return (E) elementData[lastRet = i];
}

8.step Out離開next()方法。
9.此時就會移動到for (Object o : list) {的下一行位置。

增強式for迴圈的快速鍵

I + Enter

results matching ""

    No results matching ""