JavaSE|集合類、Collection、Iterator
集合類概述
面嚮物件語言對事物的體現都是以物件的形式,所以為了方便對多個物件的操作,Java就提供了集合類。
陣列和集合的區別
- 長度區別:陣列長度固定;集合長度可變。
- 內容不同:陣列儲存的是同一種類型的元素;而集合可以儲存不同型別的元素。
- 元素的資料型別:陣列可以儲存基本資料型別,也可以儲存引用資料型別;集合只能儲存引用型別。
集合類的特點
- 集合只用於儲存物件;
- 集合長度是可變的;
- 集合可以儲存不同型別的物件。
Collection
Collection 層次結構中的根介面。Collection 表示一組物件,這些物件也稱為 collection 的元素。一些 collection 允許有重複的元素,而另一些則不允許。一些 collection 是有序的,而另一些則是無序的。
功能概述
-
新增功能 boolean add(Object obj):新增一個元素 boolean addAll(Collection c):新增一個集合的元素
-
刪除功能 void clear():移除所有元素 boolean remove(Object obj):移除一個元素 boolean removeAll(Collection c):移除一個集合的元素
-
判斷功能 boolean contains(Object obj) 判斷集合中是否包含指定的元素 boolean containsALL(Collection c)) 判斷集合中是否包含指定的集合元素,包含指定集合所有元素才返回true boolean isEmpty()
-
獲取功能 Iterator iterator():見下一個標題處。
-
長度功能 int size():元素的個數 面試題:陣列有沒有length()方法?字串有沒有length()方法?集合有沒有length()方法?(沒有;有;沒有)
-
交集功能 boolean retainAll(Collection c) 兩個集合都有的元素。返回值為true代表原集合元素發生改變,否則返回false。
-
把集合轉換為陣列 Object[] toArray()
Iterator
public interface Iterator 對 collection 進行迭代的迭代器。迭代器是依賴於
成員方法
1. Object next():獲取元素,並移動到下一個位置。 可能丟擲的異常:NoSuchElementException,代表沒有下一個元素,已經找到最後了。所以可以在每次獲取時,先判斷是否有下一個元素。
// 建立集合物件
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
// Iterator iterator():迭代器,集合的專用遍歷方式
Iterator it = c.iterator(); // 實際返回的肯定是子類物件,這裡是多型
while (it.hasNext()) {
// System.out.println(it.next());
String s = (String) it.next();
System.out.println(s);
}
2. boolean hasNext() 如果仍有元素可以迭代,則返回 true。(換句話說,如果 next 返回了元素而不是丟擲異常,則返回 true)。
需要注意的問題
- 可以用for迴圈替換while迴圈,且由於塊執行完後迭代器物件變成垃圾,for的效率比while更高。
Collection c = new ArrayList();
Student s1 = new Student("Sally", 20);
Student s2 = new Student("Jenny", 23);
Student s3 = new Student("Yu", 21);
c.add(s1);
c.add(s2);
c.add(s3);
/*Iterator iter = c.iterator();
while(iter.hasNext()){
Student s = (Student) iter.next();
System.out.println(s);
}*/
for(Iterator it = c.iterator(); it.hasNext();){
Student s = (Student) it.next();
System.out.println(s);
}
- 不要多次使用 next() 方法,因為每次使用都會移動到下一個位置。所以推薦先通過 next() 方法獲取物件,然後再進行操作。
Collection c = new ArrayList();
// 建立學生物件
Student s1 = new Student("林青霞", 27);
Student s2 = new Student("風清揚", 30);
Student s3 = new Student("令狐沖", 33);
Student s4 = new Student("武鑫", 25);
Student s5 = new Student("劉曉曲", 22);
// 把學生新增到集合中
c.add(s1);
c.add(s2);
c.add(s3);
c.add(s4);
c.add(s5);
// 遍歷
Iterator it = c.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s.getName() + "---" + s.getAge());
// NoSuchElementException 不要多次使用it.next()方法
// System.out.println(((Student) it.next()).getName() + "---"
// + ((Student) it.next()).getAge());
}
原理理解
- 迭代器為什麼不定義成一個類,而是介面? A:假設迭代器定義的是一個類,這樣我們就可以建立該類物件,呼叫該類方法來實現集合的遍歷。但是,Java中提供了很多集合類,而這些集合類的資料結構不同,故其儲存和遍歷的方式應該不同。所以沒有定義迭代器類。 無論是哪種集合,都應該具備獲取元素的操作,並且最好輔助與判斷功能,先判斷再獲取,不容易出錯。即判斷功能和獲取功能應該是一個集合遍歷所具備的,而每種集合的方式又不盡相同,故將這兩個功能提取出來,並不提供具體實現,這種方式就是介面。 真正的具體實現類,在具體子類中,以內部類的方式體現。
Iterator原始碼如下:
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();
}
// 具體的子類中以內部類的方式實現了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);
}