Collection接口
Collection表示一組稱為其元素的對象,Collection接口用于傳遞需要最大通用性的對象集合,例如,按照慣例,所有通用集合實現都有一個帶有Collection參數的構造函數,此構造函數(稱為轉換構造函數)初始化新集合以包含指定集合中的所有元素,無論給定集合的子接口或實現類型如何,換句話說,它允許你轉換集合的類型。
例如,假設你有一個Collection
Listlist = new ArrayList (c);
或者 — 如果你使用的是JDK 7或更高版本 — 你可以使用菱形運算符:
Listlist = new ArrayList<>(c);
Collection接口包含執行基本操作的方法,例如int size()、boolean isEmpty()、boolean contains(Object element)、boolean add(E element)、boolean remove(Object element)和Iterator
它還包含對整個集合進行操作的方法,例如boolean containsAll(Collection> c)、boolean addAll(Collection extends E> c)、boolean removeAll(Collection> c)、boolean retainAll(Collection> c)和void clear()。
還存在用于數組操作的額外方法(諸如Object[] toArray()和
在JDK 8及更高版本中,Collection接口還公開方法Stream
如果Collection表示一組對象,Collection接口可以滿足你的期望,它有告訴你集合中有多少元素(size、isEmpty)的方法,檢查給定對象是否在集合中的方法(contains),從集合中添加和刪除元素的方法(add、remove),和在集合上提供迭代器的方法(iterator)。
add方法的定義已經足夠廣泛,因此對于允許重復的集合以及不重復的集合都有意義,它保證Collection在調用完成后將包含指定的元素,并且如果Collection因調用而更改,則返回true。類似地,remove方法旨在從Collection中刪除指定元素的單個實例,假設它包含要開始的元素,并且如果結果修改了集合則返回true。
遍歷集合有三種遍歷集合的方法:(1)使用聚合操作(2)for-each構造(3)通過使用Iterators。
聚合操作在JDK 8及更高版本中,迭代集合的首選方法是獲取流并對其執行聚合操作,聚合操作通常與lambda表達式結合使用,以使編程更具表現力,使用更少的代碼行,以下代碼按順序遍歷一組形狀并打印出紅色對象:
myShapesCollection.stream() .filter(e -> e.getColor() == Color.RED) .forEach(e -> System.out.println(e.getName()));
同樣,你可以輕松地請求并行流,如果集合足夠大并且你的計算機具有足夠的核心,這可能是有意義的:
myShapesCollection.parallelStream() .filter(e -> e.getColor() == Color.RED) .forEach(e -> System.out.println(e.getName()));
使用此API收集數據的方法有很多種,例如,你可能希望將Collection的元素轉換為String對象,然后將它們連接起來,用逗號分隔:
String joined = elements.stream() .map(Object::toString) .collect(Collectors.joining(", "));
或者可以把所有員工的工資加起來:
int total = employees.stream() .collect(Collectors.summingInt(Employee::getSalary)));
這些只是你可以使用流和聚合操作執行的一些示例,有關更多信息和示例,請參閱聚合操作的課程。
集合框架一直提供許多所謂的“批量操作”作為其API的一部分,這些包括對整個集合進行操作的方法,例如containsAll、addAll、removeAll等,不要將這些方法與JDK 8中引入的聚合操作混淆。新聚合操作與現有批量操作(containsAll、addAll等)之間的主要區別在于舊版本都是可變的,這意味著它們都修改了底層集合,相反,新的聚合操作不會修改底層集合。使用新的聚合操作和lambda表達式時,必須注意避免突變,以免在以后從并行流運行代碼時引入問題。
for-each構造for-each構造允許你使用for循環簡明地遍歷集合或數組 — 請參閱for語句,以下代碼使用for-each構造在多帶帶的行上打印出集合的每個元素。
for (Object o : collection) System.out.println(o);迭代器
Iterator是一個使你可以遍歷集合并需要時有選擇地從集合中刪除元素的對象,通過調用iterator方法獲得集合的Iterator,以下是Iterator接口。
public interface Iterator{ boolean hasNext(); E next(); void remove(); //optional }
如果迭代具有更多元素,則hasNext方法返回true,并且next方法返回迭代中的下一個元素,remove方法從底層Collection中刪除next返回的最后一個元素,對next的每次調用只能調用remove方法一次,如果違反此規則則拋出異常。
請注意,Iterator.remove是在迭代期間修改集合的唯一安全方法,如果在迭代進行過程中以任何其他方式修改底層集合,則不指定此行為。
使用Iterator而不是for-each構造,當你需要:
刪除當前元素,for-each構造隱藏了迭代器,因此你無法調用remove,因此,for-each構造不可用于過濾。
并行迭代多個集合。
以下方法說明如何使用Iterator過濾任意Collection — 即遍歷集合刪除特定元素。
static void filter(Collection> c) { for (Iterator> it = c.iterator(); it.hasNext(); ) if (!cond(it.next())) it.remove(); }
這段簡單的代碼是多態的,這意味著無論實現如何,它都適用于任何Collection,此示例演示了使用Java集合框架編寫多態算法是多么容易。
集合接口批量操作批量操作對整個Collection執行操作,你可以使用基本操作實現這些簡寫操作,但在大多數情況下,此類實現效率較低,以下是批量操作:
containsAll — 如果目標Collection包含指定Collection中的所有元素,則返回true。
addAll — 將指定Collection中的所有元素添加到目標Collection。
removeAll — 從目標Collection中刪除它們也包含在指定Collection中的所有元素。
retainAll — 從目標Collection中刪除所有未包含在指定Collection中的元素,也就是說,它僅保留目標Collection中也包含在指定Collection中的那些元素。
clear — 從集合中刪除所有元素。
如果在執行操作的過程中修改了目標Collection,則addAll、removeAll和retainAll方法都返回true。
作為批量操作功能的一個簡單示例,請考慮以下語法,從Collection c中刪除指定元素e的所有實例。
c.removeAll(Collections.singleton(e));
更具體地說,假設你要從Collection中刪除所有null元素。
c.removeAll(Collections.singleton(null));
這個語法使用Collections.singleton,這是一個靜態工廠方法,它返回一個只包含指定元素的不可變Set。
集合接口數組操作toArray方法是作為集合和舊API之間的橋梁提供的,這些API期望輸入上的數組,數組操作允許將Collection的內容轉換為數組,沒有參數的簡單形式創建一個新的Object數組,更復雜的形式允許調用者提供數組或選擇輸出數組的運行時類型。
例如,假設c是Collection,以下代碼段將c的內容轉儲到新分配的Object數組中,該數組的長度與c中的元素數相同。
Object[] a = c.toArray();
假設已知c只包含字符串(可能因為c的類型為Collection
String[] a = c.toArray(new String[0]);上一篇:集合接口 下一篇:Set接口
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73098.html
集合接口 核心集合接口封裝了不同類型的集合,如下圖所示,這些接口允許獨立于其表示的細節來操縱集合,核心集合接口是Java集合框架的基礎,如下圖所示,核心集合接口形成層次結構。 showImg(https://segmentfault.com/img/bVbntJW?w=402&h=146); Set是一種特殊的Collection,SortedSet是一種特殊的Set,依此類推,另請注意,層次結構...
Set接口 Set是一個不能包含重復元素的Collection,它模擬了數學集抽象,Set接口僅包含從Collection繼承的方法,并添加禁止重復元素的限制,Set還為equals和hashCode操作的行為添加了一個更強的契約,允許Set實例有意義地進行比較,即使它們的實現類型不同,如果兩個Set實例包含相同的元素,則它們是相等的。 Java平臺包含三個通用的Set實現:HashSet、Tre...
List接口 List是一個有序的Collection(有時稱為序列),列表可能包含重復元素,除了從Collection繼承的操作之外,List接口還包括以下操作: 位置訪問 — 根據列表中的數字位置操縱元素,這包括get、set、add、addAll和remove等方法。 搜索 — 搜索列表中的指定對象并返回其數字位置,搜索方法包括indexOf和lastIndexOf。 迭代 — 擴展Ite...
Queue接口 Queue是在處理之前保存元素的集合,除了基本的Collection操作外,隊列還提供額外的插入、刪除和檢查操作,Queue接口如下。 public interface Queue extends Collection { E element(); boolean offer(E e); E peek(); E poll(); E remov...
Map接口 Map是將鍵映射到值的對象,map不能包含重復的鍵:每個鍵最多可以映射一個值,它模擬數學函數抽象。Map接口包括基本操作的方法(如put、get、remove、containsKey、containsValue、size和empty),批量操作(如putAll和clear)和集合視圖(如keySet、entrySet和values)。 Java平臺包含三個通用Map實現:HashMap...
閱讀 1343·2019-08-30 15:55
閱讀 1645·2019-08-26 10:21
閱讀 3438·2019-08-23 18:28
閱讀 3375·2019-08-23 15:38
閱讀 744·2019-08-23 15:24
閱讀 2135·2019-08-23 13:59
閱讀 775·2019-08-23 11:31
閱讀 2871·2019-08-23 10:53