1. 程式人生 > 其它 >Java集合框架之 Collection 介面

Java集合框架之 Collection 介面

Collection 介面

所有通用集合實現都有一個帶有 Collection 引數的建構函式,此建構函式初始化新集合以包含指定集合中的所有元素,即它允許轉換集合的型別。

如把一個 Collection s,它可以轉化成 List、Set 或其他型別的 Collection。如:

List s = new ArrayList(c);

Collection 介面包含執行基本操作的方法:

​​int size()​​ ​​boolean isEmpty()​​ ​​boolean contains(Object element​​ ​​boolean add(E element)​​ ​​boolean remove(Object element)​​ ​​Interator interator()​​

Collection 介面還包含對整個集合進行操作的方法:

​​boolean containsAll(Collection c)​​ ​​boolean addAll(Collection c)​​ ​​boolean removeAll(Collection c)​​ ​​boolean retainAll(Collection<?> c)​​ ​​void clear()​​ Collection 介面還存在用於陣列操作的附加方法,例如:

​​Object[] toArray()​​ ​​ T[] toArray(T[] a)​​

JDK 8 及更高版本中,Collection 介面還公開方法 Stream stream() 和 Stream parallelStream(),幫助從底層集合中獲取順序或並行流。

public interface Collection { boolean add(E element); Interator iterator(); // 返回一個用於訪問集合中各個元素的迭代器 }

​​add​​ 方法用於向集合中新增元素。如果成功新增元素改變了集合就返回 true;如果集合沒有發生改變就返回 false。比如在集合( set )中新增一個物件,如果這個元素在集合中已經存在,這時 add 方法就沒有奏效,因為集合中不允許有重複的物件。

​​interator​​ 方法用於返回一個實現了 Interator 介面的物件,可以使用這個迭代器物件依次訪問集合中的元素。

集合遍歷介面--迭代器 Iterator 介面包含 4 個方法:

public interface Interator { E next(); // 返回將要訪問的下一個物件。如果已經到達了集合的末尾,將丟擲一個 NoSuchElement-Exception boolean hasNext(); // 如果存在另一個可訪問的元素,返回 true void remove(); // 刪除上次訪問的物件。這個方法必須緊跟在訪問一個元素之後執行。如果上次訪問之後集合已經發生了變化,這個方法將會丟擲一個 IllegalStateException default void forEachRemaining(Consumer<? super E> action); // 訪問元素,並傳遞到指定的動作,直到再沒有更多元素,或者這個動作丟擲一個異常 }

通過反覆呼叫 ​​next​​​ 方法,可以逐個訪問集合中的每個元素。但是,如果到達了集合的末尾,next 方法將丟擲一個 ​​NoSuchElementException​​。因此,在需要呼叫 next 之前呼叫 hasNext 方法。

​​hashNext​​ 如果迭代器物件還有多個可以訪問的元素,這個方法就返回 true。

Collection c = ...; Interator iter = c.iterator(); while (iter.hasNext()) { String element = iter.next(); // do something with element }

用 ​​for each​​ 迴圈可以更加簡練地表達同樣的迴圈操作:

for (String element : c) { // do something with element System.out.Println(element); }

​​for each​​ 迴圈可以處理任何實現了 Iterable 介面的物件,這個物件只包含一個抽象方法:

public interface Iterable { Iterator iterator(); }

java培訓學習中JDK8 及更高版本中,迭代集合的首選方法是獲取流並對其執行聚合操作。聚合操作需要與 Lambda 表示式結合使用,以使用較少的程式碼使程式設計更具表現力。

myShapeCollection.stream() .filter(e -> e.getColor() == Color.RED) .forEach(e -> System.out.Println(e.getName()));

訪問元素的順序取決於集合型別。

如果迭代處理一個 ArrayList,迭代器索引從 0 開始,沒迭代一次,索引值加 1 。 如果訪問 HashSet 中的元素,會按照一種基本上隨機的順序獲得元素。(每一次訪問的順序都是唯一的)

Iterator 介面的 ​​remove​​ 方法將會刪除上次呼叫 next 方法時返回的元素。目的是:刪除某個元素前最該先看一下這個元素。

集合介面批量操作 批量操作對整個集合執行操作。包含基本的方法有:

​​contailsAll​​: 如果目標 Collection 包含指定 Collection 中的所有元素,就返回 true。 ​​addAll​​: 將指定 Collection 中的所有元素新增到目標 Collection。 ​​removeAll​​: 從目標 Collection 中刪除包含在指定 Collection 中的所有元素。 ​​retainAll​​: 從目標 Collection 中刪除所有所有未包含在指定 Collection 中刪除所有未包含在指定 Collection 中的元素。 ​​clear​​: 從集合中刪除所有元素。

如,檢測任意集合是否包含指定元素的泛型方法:

public static boolean contains(Collection c, Object obj) { for (E element : c) if (element.equals(obj)) return true; return false; }

其他方法 還有一些實用方法非常有用,應該將它們提供給使用者實用。下面列舉一部分:

int size() // 返回當前儲存在集合中的元素個數 boolean isEmpty() // 如何集合中沒有元素,返回 true boolean contains(Object obj) // 如果集合中包含了一個與obj相等的元素,返回true boolean equals(Object other) // 如果集合與 other 集合相等,返回true boolean add(E element) // 將一個元素新增到集合中。由於這個呼叫改變了集合,返回 true boolean addAll(Collection from) // 將 other 集合中的所有元素新增到這個集合。如果由於這個呼叫改變了這個集合,返回true boolean remove(Object obj) // 從這個集合中刪除等於 obj 的物件。如果有匹配的物件被刪除,返回true boolean removeAll(Collection c) // 從這個集合中刪除obj集合中存在的所有元素。如果這個呼叫改變了集合,返回true default boolean removeIf(Predicate filter // JDK8, 從這個集合中刪除filter返回true的所有元素,如果因為這個呼叫改變了集合,返回true void clear() // 從這個集合中刪除所有的元素 boolean retainAll(Collection c) // 從這個集合中刪除所有與other集合元素不同的元素。如果由於這個呼叫改變了集合,返回true Object[] toArray() // 返回這個集合中的物件的陣列 T[] toArray(T[] arrayToFill)

​​ T[] toArray(T[] arrayToFill)​​ :返回這個集合中的物件的陣列。如果 arrayToFill 足夠大,就將集合中的元素填入這個陣列中,剩餘空間填補 null;否則,分配一個新陣列,其成員型別與 arrayToFill 的成員型別相同,其長度等於集合的大小,並填充集合元素。