Collection與Iterator
Prerequisites:
集合介面Interface的繼承圖如下:
上圖每一個都是介面Interface。
Collection介面下面有List介面與Set介面,List是可以放重覆的資料,Set不可以放重覆的資料。
List是有順序的,Set是沒有順序。
Iterator介面是集合的疊代器,用來遍歷集合。
Collection
提供以下方法,只要是實作Collection介面的子類別,都可以用以下方法。
- add 新增
- remove 刪除
- contains 是否在集合中?
- size 大小
- isEmpty
- clear
- addAll
- containsAll
- 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