閱讀236 返回首頁    go 魔獸


Java集合-Collection

Collection接口是 (java.util.Collection)是Java集合類的頂級接口之一。所以不能直接實例化一個Collection,但是可以實例化它的一個子類,你或許經常把這些子類作為一個Collection統一探討。在這篇文章中,你將看到如何處理。

下麵是本文的一個主題列表:

  1. Collection子類
  2. 增加和移除元素
  3. 檢測一個Collection是否包含一個確定的元素
  4. Collection大小
  5. 遍曆一個Collection

Collection子類
下麵的接口繼承了Collection接口:

  1. List
  2. Set
  3. SortedSet
  4. NavigableSet
  5. Queue
  6. Deque

Java沒有一個可用的Collection接口的實現,所以你必須使用上述列表中的子類。Collection接口僅僅隻是定義了每個子類共享的一係列方法。這使得忽略你具體使用的Collection類型而把他們當作一個Collection統一對待成為可能。這是一個標準的繼承,沒有什麼神奇之處,但是有時候會成為一個很好的特性。本文的後麵部分將描述這些常用操作的大部分使用方法。

下麵是一個Collection操作的一個方法:

01 public class MyCollectionUtil{
02  
03   public static void doSomething(Collection collection) {
04  
05     Iterator iterator = collection.iterator();
06     while(iterator.hasNext()){
07       Object object = iterator.next();
08  
09       //do something to object here...
10     }
11   }
12 }

下麵是調用不用類型的Collection子類的方法的一些方式:

1 Set  set  = new HashSet();
2 List list = new ArrayList();
3  
4 MyCollectionUtil.doSomething(set);
5 MyCollectionUtil.doSomething(list);

增加和移除元素

不管你使用的是哪種類型的Collection子類,有一些標準的方法從一個Collection中增加和移除元素。增加和移除單個的元素就像下麵這樣:

1 String     anElement  = "an element";
2 Collection collection = new HashSet();
3  
4 boolean didCollectionChange = collection.add(anElement);
5 boolean wasElementRemoved   = collection.remove(anElement);

add()方法向Collection中增加元素,如果Collection結構改變了,作為add()方法的結果,將返回true。如果一個Set的實例中已經存在了這個元素,那麼不會重複增加,這個Set實例的結構也不會發生變化。另一方麵,如果在一個List上調用這個方法,而這個List已經存在了這個元素,那麼這個List將有兩個這個元素。

remove()方法移除一個元素。如果Collection中存在這個元素並且被移除了,這個方法將返回true。如果元素不存在,將返回false。

你也可以增加和移除Collection對象,下麵是一些示例:

01 Set  aSet  = ... // get Set  with elements from somewhere
02 List aList = ... // get List with elements from somewhere
03  
04 Collection collection = new HashSet();
05  
06 collection.addAll(aSet);    //returns boolean too, but ignored here.
07 collection.addAll(aList);   //returns boolean too, but ignored here.
08  
09 collection.removeAll(aList);   //returns boolean too...
10 collection.retainAll(aSet);    //returns boolean too...

addAll()方法增加通過參數傳遞過來的Collection中的所有元素。這個Collection對象本身不會被添加,僅僅隻是添加它的元素。但是如果你調用add()方法傳遞這個參數,這個Collection對象本身將被添加,而不是它的元素。

正是由於addAll()方法依賴於Collection的子類。有一些子類允許一樣的元素被多次添加,而另外一些則不允許。

removeAll()方法移除通過參數傳遞過來的Collection中的所有元素。如果傳遞過來的Collection中某些元素在目標Collection中不存在,這些元素將會忽略。

retainAll()方法正好和removeAll()方法相反。不是移除所有給定參數Collection中元素,而是保留保留這些元素,移除其他的。記住,隻有目標Collection中已經存在了這些元素,這些元素才可以保留。在參數Collection中存在而目標Collection中不存在的元素,將不會被新增到目標Collection。它們將被忽略:

來看看一些使用偽代碼的例子:

01 Collection colA = [A,B,C]
02 Collection colB = [1,2,3]
03  
04 Collection target = [];
05  
06 target.addAll(colA);     //target now contains [A,B,C]
07 target.addAll(colB);     //target now contains [A,B,C,1,2,3]
08  
09 target.retainAll(colB);  //target now contains [1,2,3]
10  
11 target.removeAll(colA);  //nothing happens - already removed
12 target.removeAll(colB);  //target is now empty.

檢測一個Collection是否包含一個確定的元素

Collection接口有兩個方法來檢查一個Collection是否包含一個或多個元素。這就是contains()containsAll()方法。它們在下麵被說明:

1 Collection collection   = new HashSet();
2 boolean containsElement = collection.contains("an element");
3  
4 Collection elements     = new HashSet();
5 boolean containsAll     = collection.containsAll(elements);

如果這個Collection含有這個元素,contains()方法將返回true,反之,則亦然。
如果這個Collection包含給定Collection參數中的所有元素,containsAll()方法將返回true,反之,則亦然。

Collection大小

你可以通過調用size()方法來檢測一個Collection的大小,”Size“表示Collection中的元素個數,下麵是一個示例:

1 int numberOfElements = collection.size();

迭代一個Collection

你可以迭代collection中的所有元素,collection中包含的Iterator將完成這件事情,就像下麵這樣:

1 Collection collection = new HashSet();
2 //... add elements to the collection
3  
4 Iterator iterator = collection.iterator();
5 while(iterator.hasNext()){
6     Object object = iterator.next();
7     //do something to object;
8 }

你也可以使用新的for循環:

1 Collection collection = new HashSet();
2 //... add elements to the collection
3  
4 for(Object object : collection) {
5   //do something to object;
6 }

最後更新:2017-05-22 14:02:21

  上一篇:go  Linux 下網絡協議分析器 Wireshark 使用基礎
  下一篇:go  《 Java並發編程從入門到精通》第5章 多線程之間交互:線程閥