1. 程式人生 > >JavaSE|集合類、Collection、Iterator

JavaSE|集合類、Collection、Iterator

集合類概述

面嚮物件語言對事物的體現都是以物件的形式,所以為了方便對多個物件的操作,Java就提供了集合類。

陣列和集合的區別

  1. 長度區別:陣列長度固定;集合長度可變。
  2. 內容不同:陣列儲存的是同一種類型的元素;而集合可以儲存不同型別的元素。
  3. 元素的資料型別:陣列可以儲存基本資料型別,也可以儲存引用資料型別;集合只能儲存引用型別。

集合類的特點

  1. 集合只用於儲存物件
  2. 集合長度是可變的;
  3. 集合可以儲存不同型別的物件。

Collection

Collection 層次結構中的根介面。Collection 表示一組物件,這些物件也稱為 collection 的元素。一些 collection 允許有重複的元素,而另一些則不允許。一些 collection 是有序的,而另一些則是無序的。

功能概述

  1. 新增功能 boolean add(Object obj):新增一個元素 boolean addAll(Collection c):新增一個集合的元素

  2. 刪除功能 void clear():移除所有元素 boolean remove(Object obj):移除一個元素 boolean removeAll(Collection c):移除一個集合的元素

  3. 判斷功能 boolean contains(Object obj) 判斷集合中是否包含指定的元素 boolean containsALL(Collection c)) 判斷集合中是否包含指定的集合元素,包含指定集合所有元素才返回true boolean isEmpty()

    :判斷集合是否為空

  4. 獲取功能 Iterator iterator():見下一個標題處。

  5. 長度功能 int size():元素的個數 面試題:陣列有沒有length()方法?字串有沒有length()方法?集合有沒有length()方法?(沒有;有;沒有)

  6. 交集功能 boolean retainAll(Collection c) 兩個集合都有的元素。返回值為true代表原集合元素發生改變,否則返回false。

  7. 把集合轉換為陣列 Object[] toArray()

Iterator

public interface Iterator 對 collection 進行迭代的迭代器。迭代器是依賴於

集合存在的。 Collection的成員方法:Iterator iterator()

成員方法

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)。

需要注意的問題

  1. 可以用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);
		}
  1. 不要多次使用 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);
	}