原文出自:http://www.cnblogs.com/CocoonFan/archive/2013/03/11/2953312.html
在編程的時候,常常需要集中存放多個數據。我們可以使用數組來存放這些數據,但是數組有一個缺點:數組的長度是不可變的,數組的空間開闢太大會造成浪費,開闢的空間太小又不夠用。這時候就可以使用集合了。
爲了保存數量不確定的數據和保存具有映射關係的數據,Java提供了集合類。所有的集合類都在 java.util包下。
Java的集合類主要由兩個接口派生出:Collection和Map.這兩個接口又包含了一些子接口或者實現類。
下圖是java 集合體系
在Set和List接口是Collection派生出來的兩個子接口,分別代表了無序集和有序集。
Map保存的每項數據都是key-value對,其中key是不可重複的,需要查閱Map中的值時總是根據key來獲取。
下面列出了Collection定義的操作集合元素的方法:
· boolean add(Object):確保容器能持有你傳給它的那個參數。如果沒有把它加進去,就返回false。
· boolean addAll(Collection):加入參數Collection所含的所有元素。只要加了元素,就返回true。
· void clear():清除容器所保存的所有元素。
· boolean contains(Object):如果容器持有參數Object。
· boolean containsAll(Collection):判斷一個集合是否是另一個集合的子集。
· boolean isEmpty():如果容器裏面沒有保存任何元素,就返回true。
· Iterator iterator():返回一個可以在容器的各元素之間移動的Iterator。
· boolean removeAll(Collection):集合的差。只要刪過東西,就返回true。
· boolean retainAll(Collection):只保存參數Collection所包括的元素(集合論中“交集”的概念)。如果發生過變化,則返回true。
· int size():返回容器所含元素的數量。
· Object[] toArray():返回一個包含容器中所有元素的數組。
· Object[] toArray(Object[] a):返回一個包含容器中所有元素的數組,且這個數組不是普通的Object數組,它的類型應該同參數數組a的類型相同(要做類型轉換)。
下面這個例子演示了常用的集合操作:
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class IteratorTest {
public static void main(String[] args) {
Collection collection = new ArrayList();
//添加元素
//雖然Java集合不能放基本類型的值,但Java 1.5之後增加了自動裝箱拆功能
collection.add(100);
collection.add(new Boolean(false));
collection.add("Cocoon");
collection.add("Fan");
System.out.println("集合的大小:" + collection.size());
//用Iterator遍歷
Iterator iterator = collection.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println();
//刪除指定的元素
collection.remove(false);
//用foreach遍歷集合
System.out.println("刪除元素後集合的大小:" + collection.size());
for (Object object : collection) {
System.out.println(object);
}
System.out.println();
Collection collection2 = new HashSet();
collection2.add("Cocoon");
collection2.add(100);
//判斷一個集合是否爲另一個集合的子集
System.out.println("collection2 是否爲 collection的子集:"
+ collection.containsAll(collection2));
//判斷一個集合中是否包含某個元素
System.out.println("collection 是否包含 \"Cocoon\"字符串:"
+ collection.contains("Cocoon"));
//求兩個集合的差 A-B
collection.removeAll(collection2);
System.out.println("collection - collection2 = " + collection);
//求兩個集合的並:A+B
collection.addAll(collection2);
System.out.println("collection + collection2 = " + collection);
//求兩個集合的∩: A∩B
collection.retainAll(collection2);
System.out.println("collection ∩ collection2 = " + collection);
//清空collection中所有的元素
collection.clear();
System.out.println("清空後collection的大小爲:" + collection.size());
System.out.println("collection = " + collection);
}
}
輸出的結果:
集合的大小:4
false
Cocoon
Fan
刪除元素後集合的大小:3
Cocoon
Fan
collection2 是否爲 collection的子集:true
collection 是否包含 "Cocoon"字符串:true
collection - collection2 = [Fan]
collection + collection2 = [Fan, 100, Cocoon]
collection ∩ collection2 = [100, Cocoon]
清空後collection的大小爲:0
collection = []
另外在使用Iterator接口遍歷集合元素的時候常用到下面三個方法
· boolean hasNext():如果被迭代的集合元素還沒有被遍歷,則返回true
· Object next():返回集合裏的下一個元素
· void remove(): 刪除集合裏面上一次next方法返回的元素
實例見上面的19行代碼。
在使用Iterator接口時應注意:
· Iterator僅用來遍歷集合,它本身並不提供盛放對象的能力,如果需要創建Iterator對象,則應該有一個迭代的集合。
· Iterator對集合元素進行迭代時並不是把集合元素本身傳給課迭代器,而是把集合元素的值傳給了迭代變量,所以修改迭代變量的值並不會對集合元素本身產生影響。
· 當使用Iterator迭代訪問Collection集合元素是,Collection集合裏的元素不能被改變,只有通過Iterator的remove()方法刪除上一次next方法返回的集合元素。
如在Iterator裏面修改Collection集合裏元素的值
//會報java.util.ConcurrentModificationException異常
collection.remove(iterator.next());
則會報出java.util.ConcurrentModificationException異常。