【吐血整理】Java Collections你必須知道的13件事情

開始:

你好,早上、中午、下午、晚上好。我是Java2B哥(微信搜Java2B)。一名無緣985,平常996工程師。 java

微信搜:Java2B
今天2B哥和你們說說Java Collections 相關的知識點,這幾個點你們是必定要會哦~~~由於 Java Collections Framework是Java編程語言的核心部分之一。集合幾乎用於每種編程語言中。大多數編程語言都支持各類類型的集合,例如列表,集合,隊列,堆棧等。咱們應該如何去了解了?來看下文

1.什麼是Java Collections Framework?

集合就像容器同樣,將多個項目組合在一個單元中。例如,一罐巧克力,名稱列表等。程序員

每種編程語言都使用了Collections,當Java出現時,它也帶有一些Collection類-Vector,Stack,Hashtable和Array。算法

Java 1.2提供了Collections Framework,這是一種以標準方式表示和操縱Java中Collections的體系結構。Java Collections Framework由如下部分組成:編程

接口:Java Collections Framework接口提供抽象數據類型來表示集合。java.util.Collection是Collections Framework的根接口。它在Collections框架層次結構的頂部。它包含諸如一些重要的方法size(),iterator(),add(),remove(),clear(),每個集合類必須實現。 其餘一些重要的接口是java.util.List,java.util.Set,java.util.Queue和java.util.Map。設計模式

Map是惟一一個不從Collection接口繼承的接口,但它是Collections框架的一部分。全部集合框架接口都存在於java.util包中。數組

實現類:Java Collections框架提供了集合的核心實現類。咱們可使用它們在java程序中建立不一樣類型的集合。 一些重要的集合類是ArrayList,LinkedList,HashMap,TreeMap,HashSet,TreeSet。安全

這些類知足了咱們大多數的編程需求,可是若是咱們須要一些特殊的集合類,咱們能夠擴展它們以建立咱們的自定義集合類。微信

Java 1.5提供了線程安全的集合類,該類容許在迭代它的同時修改Collections。其中有些是CopyOnWriteArrayList,ConcurrentHashMap,CopyOnWriteArraySet。數據結構

這些類位於java.util.concurrent包中。全部集合類都存在於java.util和java.util.concurrent包中。併發

算法:算法是提供一些經常使用功能的有用方法,例如搜索,排序和改組。 下面的類圖顯示了Collections Framework層次結構。爲簡單起見,我僅包括經常使用的接口和類。

Java中的集合,java Collections Framework

2. Java Collections Framework的好處

Java Collections框架具備如下優勢:

減小的開發工做量 –幾乎全部常見類型的集合都附帶了它,並提供有用的方法來迭代和處理數據。所以,咱們能夠將更多精力放在業務邏輯上,而不是設計集合API。 提升質量 –使用通過良好測試的核心集合類能夠提升咱們的程序質量,而不是使用任何自行開發的數據結構。 可重用性和互操做性 減小工做量 –若是咱們使用核心集合API類,則能夠學習任何新的API。

3. Java Collections接口

Java集合接口是Java集合框架的基礎。請注意,全部核心集合接口都是通用的。例如public interface Collection。語法適用於泛型,當咱們聲明Collection時,應該使用它來指定它能夠包含的Object的類型。經過在編譯時對對象進行類型檢查,它有助於減小運行時錯誤。

爲了使核心集合接口的數量易於管理,Java平臺沒有爲每種集合類型的每一個變體提供單獨的接口。若是調用了不受支持的操做,則收集實現將引起UnsupportedOperationException。

3.1)Collection Interface接口

這是集合層次結構的根。集合表示一組稱爲其元素的對象。Java平臺不提供此接口的任何直接實現。

該接口有方法來告訴你有多少元素集合中(size,isEmpty),檢查給定對象是不是集合(中contains),添加和從集合中刪除元素(add,remove),並在提供的迭代器集合(iterator)。

Collection接口還提供批量操做方法,關於整個徵集工做- ,containsAll,addAll,removeAll,。retainAllclear

toArray提供這些方法做爲集合與指望輸入上有數組的舊API之間的橋樑。

3.2)Iterator Interface迭代器接口

迭代器接口提供了對任何Collection進行迭代的方法。咱們可使用iterator方法從Collection中獲取迭代器實例。Enumeration在Java Collections Framework中,Iterator代替了。迭代器容許調用者在迭代過程當中從基礎集合中刪除元素。集合類中的迭代器實現「 迭代器設計模式」。

3.3) Set Interface Set接口

Set是一個不能包含重複元素的集合。此接口對數學集合的抽象進行建模,並用於表示集合,例如紙牌組。

Java平臺包含三個通用Set實現:HashSet,TreeSet,和LinkedHashSet。Set接口不容許隨機訪問Collection中的元素。您可使用迭代器或foreach循環遍歷Set的元素。

3.4) ListInterface列表接口

List是一個有序的集合,能夠包含重複的元素。您能夠從其索引訪問任何元素。列表更像是具備動態長度的數組。列表是最經常使用的集合類型之一。ArrayList而且LinkedList是List接口的實現類。

列表接口提供了有用的方法,能夠在特定索引處添加元素,基於索引移除/替換元素以及使用索引獲取子列表。

List strList = new ArrayList<>();

//add at last
strList.add(0, "0");

//add at specified index
strList.add(1, "1");

//replace
strList.set(1, "2");

//remove
strList.remove("1");
複製代碼

Collections類提供了列表一些有用的算法- ,sort,,shuffle 等。reversebinarySearch

3.5)Queue Interface隊列接口

隊列是用於在處理以前保存多個元素的集合。除了基本的收集操做外,隊列還提供其餘插入,提取和檢查操做。

隊列一般但不必定以FIFO(先進先出)的方式對元素進行排序。優先隊列除外,它們根據提供的比較器或元素的天然順序對元素進行排序。不管使用哪一種順序,隊列的開頭都是將經過調用remove或poll刪除的元素。在FIFO隊列中,全部新元素都插入隊列的尾部。

3.6)Dequeue Interface出隊接口

支持在兩端插入和刪除元素的線性集合。deque這個名稱是「雙端隊列」的縮寫,一般發音爲「 deck」。大多數Deque實現對它們可能包含的元素數量沒有固定的限制,可是此接口支持容量受限的雙端隊列以及沒有固定大小限制的雙端隊列。

此接口定義訪問雙端隊列兩端的元素的方法。提供了用於插入,刪除和檢查元素的方法。

3.7)Map Interface接口

Java Map是一個將鍵映射到值的對象。映射不能包含重複的鍵:每一個鍵最多能夠映射到一個值。

Java平臺包含三個通用Map實現:HashMap,TreeMap,和LinkedHashMap。

地圖的基本操做是put,get,containsKey,containsValue,size,和isEmpty。

3.8)ListIterator接口

列表的迭代器,容許程序員在任一方向上遍歷列表,在迭代過程當中修改列表,並獲取迭代器在列表中的當前位置。

Java ListIterator沒有當前元素;它的光標位置始終位於經過調用previous()返回的元素和經過調用next()返回的元素之間。

3.9)SortedSet接口

SortedSet是一個Set,它按升序維護其元素。提供了一些其餘操做以利用訂購的優點。排序的集合用於天然排序的集合,例如單詞列表和成員資格列表。

3.10)SortedMap接口

以升序順序維護其映射的Map。這是SortedSet的Map模擬。排序後的地圖用於鍵/值對的天然排序集合,例如字典和電話簿。

4. Java集合類

Java Collections框架帶有許多接口實現類。最多見的實現是ArrayList,HashMap和HashSet。Java 1.5包含併發實現;例如ConcurrentHashMap和CopyOnWriteArrayList。一般,Collection類不是線程安全的,而且其迭代器是快速失敗的。在本節中,咱們將學習經常使用的收集類。

4.1)HashSet類

Java HashSet是由HashMap支持的Set接口的基本實現。它不保證集合的迭代順序,並容許使用null元素。

基本操做(這個類提供了固定的時間性能add,remove,contains和size),假定哈希函數將分散的元素正確的桶中。咱們能夠爲此集合設置初始容量和負載因子。負載因子是散列映射被容許在自動增長其容量以前得到的填充程度的度量。

4.2)TreeSet類

NavigableSet基於的實現TreeMap。元素使用其天然順序進行排序,或者經過Comparator在設置建立時提供的元素進行排序,具體取決於所使用的構造函數。

參考:Java可比比較器

此實現爲基本操做(添加,刪除和包含)提供了保證的log(n)時間成本。

請注意,若是要正確實現Set接口,則由集合(不管是否提供顯式比較器)維護的順序必須等於equals。(有關與equals一致的精肯定義,請參見Comparable或Comparator。)之因此這樣,是由於Set接口是根據equals操做定義的,可是TreeSet實例使用其compareTo(或compare)方法執行全部元素比較,所以兩個從集合的角度來看,此方法認爲相等的元素是相等的。

4.3)ArrayList類

Java ArrayList是List接口的可調整大小的數組實現。實現全部可選的列表操做,並容許全部元素,包括null。除了實現List接口以外,此類還提供一些方法來操縱內部用於存儲列表的數組的大小。(此類與Vector大體等效,但它是不一樣步的。)

size isEmpty,get,set,iterator和list迭代器操做在恆定時間內運行。加法運算以固定的固定時間運行,也就是說,添加n個元素須要O(n)時間。全部其餘操做均以線性時間運行(大體而言)。與LinkedList實現相比,常數因子較低。

進一步閱讀:Java ArrayList和Iterator

4.4)LinkedList類

List和Deque接口的雙連接列表實現。實現全部可選的列表操做,並容許全部元素(包括null)。

全部操做均按雙鏈表的預期執行。索引到列表中的操做將從開頭或結尾遍歷列表,以更接近指定索引的位置爲準。

4.5)HashMap類

基於哈希表的Map接口的實現。此實現提供全部可選的映射操做,並容許空值和空鍵。HashMap類與Hashtable大體等效,但它是不一樣步的,而且容許爲null。此類沒法保證地圖的順序。

此實現爲基本操做(get和put)提供了恆定時間的性能。它爲構造函數提供了設置集合的初始容量和負載因子的功能。

進一步閱讀:HashMap與ConcurrentHashMap

4.6)TreeMap類

基於紅黑樹的NavigableMap實現。根據映射鍵的天然順序或在映射建立時提供的Comparator對映射進行排序,具體取決於所使用的構造函數。

此實現爲containsKey,get,put和remove操做提供了保證的log(n)時間成本。算法是對Cormen,Leiserson和Rivest的「算法簡介」中的算法的改編。

請注意,TreeMap維護的排序(與任何排序的映射同樣)以及是否提供顯式比較器必須與equals一致,以便此排序的映射正確實現Map接口。(有關與equals一致的精肯定義,請參見Comparable或Comparator。)之因此這樣,是由於Map接口是根據equals操做定義的,可是排序後的map使用其compareTo(或compare)方法執行全部鍵比較,所以兩個從已排序映射的角度來看,此方法認爲相等的鍵是相等的。排序後的映射的行爲是明肯定義的,即便其排序與equals不一致也是如此;它只是不遵照Map接口的通常約定。

4.7)PriorityQueue類

隊列按FIFO順序處理其元素,但有時咱們但願根據元素的優先級對其進行處理。在這種狀況下,咱們可使用PriorityQueue,而且在實例化PriorityQueue時須要提供Comparator實現。PriorityQueue不容許空值,而且它是無界的。有關此的更多詳細信息,請轉到Java Priority Queue,您能夠在其中經過示例程序檢查其使用狀況。

5.Collections class

Java Collections類僅由對集合進行操做或返回集合的靜態方法組成。它包含對集合進行操做的多態算法,「包裝器」(包裝器),這些包裝器返回由指定集合支持的新集合,以及其餘一些零碎的結局。

此類包含用於集合框架算法的方法,例如二進制搜索,排序,改組,反向等。

6.Synchronized Wrappers同步包裝

同步包裝器將自動同步(線程安全)添加到任意集合。六個核心集合接口(集合,集合,列表,地圖,SortedSet和SortedMap)中的每一個都有一個靜態工廠方法。

public static Collection synchronizedCollection(Collection c); public static Set synchronizedSet(Set s); public static List synchronizedList(List list); public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m); public static SortedSet synchronizedSortedSet(SortedSet s); public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m); 這些方法中的每個都返回一個由指定集合備份的同步(線程安全)集合。

7.Unmodifiable wrappers不可修改的包裝器

不可修改的包裝器經過攔截全部會修改集合並拋出的操做,從而喪失了修改集合的能力UnsupportedOperationException。它的主要用途是;

使集合一旦創建便不可變。在這種狀況下,最好不要保留對後備集合的引用。這絕對保證了不變性。 容許某些客戶端以只讀方式訪問您的數據結構。您保留對後備集合的引用,但分發對包裝器的引用。這樣,在您保持徹底訪問權限的同時,客戶端能夠查看但不能修改。 這些方法是:

public static Collection unmodifiableCollection(Collection<? extends T> c); public static Set unmodifiableSet(Set<? extends T> s); public static List unmodifiableList(List<? extends T> list); public static <K,V> Map<K, V> unmodifiableMap(Map<? extends K, ? extends V> m); public static SortedSet unmodifiableSortedSet(SortedSet<? extends T> s); public static <K,V> SortedMap<K, V> unmodifiableSortedMap(SortedMap<K, ? extends V> m);

8.線程安全集合

Java 1.5併發包(java.util.concurrent)包含線程安全的集合類,這些類容許在迭代時修改集合。經過設計迭代器是快速失敗的,並拋出ConcurrentModificationException。有些班是CopyOnWriteArrayList,ConcurrentHashMap,CopyOnWriteArraySet。

閱讀這些帖子以更詳細地瞭解它們。

避免ConcurrentModificationException CopyOnWriteArrayList示例 HashMap與ConcurrentHashMap

9.集合API算法

Java Collections Framework提供了經常使用的算法實現,例如排序和搜索。集合類包含這些方法實現。這些算法大多數均可以在List上使用,可是其中一些算法適用於全部類型的集合。

9.1)排序

排序算法對List進行從新排序,以便其元素根據排序關係以升序排列。提供了兩種形式的操做。簡單形式採用一個List,並根據其元素的天然順序對其進行排序。排序的第二種形式除列表外還包含一個Comparator,並使用Comparator對元素進行排序。

9.2)改組

隨機播放算法會破壞列表中可能存在的任何順序跟蹤。即,該算法基於來自隨機性源的輸入對List進行從新排序,從而假定合理的隨機性源,全部可能的排列均以相同的可能性發生。該算法在實施機會遊戲中頗有用。

9.3)搜索

binarySearch算法在排序列表中搜索指定的元素。該算法有兩種形式。第一個帶有一個List和一個要搜索的元素(「搜索關鍵字」)。

此格式假定列表根據其元素的天然順序以升序排序。

第二種形式除列表和搜索鍵外還採用比較器,並假定根據指定的比較器將列表按升序排序。

排序算法可用於在調用binarySearch以前對List進行排序。

9.4)組成

頻率算法和不相交算法測試一個或多個集合的組成的某些方面。

頻率:計算指定元素在指定集合中出現的次數 不相交:肯定兩個集合是否不相交;也就是說,它們是否不包含共同點

9.5)最小值和最大值

最小和最大算法分別返回指定Collection中包含的最小和最大元素。這兩種操做都有兩種形式。簡單形式僅採用Collection並根據元素的天然順序返回最小(或最大)元素。 第二種形式除了Collection以外還採用Comparator,並根據指定的Comparator返回最小(或最大)元素。

10. Java 8 Collections API功能

Java 8的最大變化與Collection API有關。一些重要的更改和改進是:

有關用於順序處理和並行處理的Stream API的介紹,您應該閱讀Java Stream API Tutorial以得到更多詳細信息。 可迭代接口已使用forEach()默認方法擴展,可用於遍歷集合。 Lambda表達式和功能性接口最適合Collection API類。

. Java 10 Collections API的更改

List.copyOf,Set.copyOf和Map.copyOf方法,以建立不可修改的集合。 Collectors類得到各類方法來收集不可修改的集合(Set,List,Map)。這些方法名稱爲toUnmodifiableList,toUnmodifiableSet和toUnmodifiableMap。 讓咱們看一下這些新的Java 10 Collections API方法用法的示例。

package com.java2b.collections;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class JDK10CollectionFunctions {

	public static void main(String[] args) {

		// 1. List, Set, Map copyOf(Collection) method
		List<String> actors = new ArrayList<>();

		actors.add("Java2B哥");
		actors.add("Marlon Brando");

		System.out.println(actors);
		// prints [Jack Nicholson, Marlon Brando]

		// New API added - Creates an UnModifiable List from a List.
		List<String> copyOfActors = List.copyOf(actors);

		System.out.println(copyOfActors);
		// prints [Jack Nicholson, Marlon Brando]

		// copyOfActors.add("Robert De Niro"); Will generate
		// UnsupportedOperationException

		actors.add("Robert De Niro");

		System.out.println(actors);
		// prints [Jack Nicholson, Marlon Brando, Robert De Niro]

		System.out.println(copyOfActors);
		// prints [Jack Nicholson, Marlon Brando]

		// 2. Collectors class toUnmodifiableList, toUnmodifiableSet, and
		// toUnmodifiableMap methods
		List<String> collect = actors.stream().collect(Collectors.toUnmodifiableList());
		System.out.println(collect);
	}

}
複製代碼
  1. Java 11 Collections API的更改 toArray(IntFunction<T[]> generator)Collection界面中添加了一個新的默認方法。此方法使用提供的生成器函數分配返回的數組,該數組返回包含此集合中全部元素的數組。
package com.Java2b.collections;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JDK11CollectionFunctions {

	public static void main(String[] args) {

		/* * JDK 11 New Method in Collection interface * default <T> T[] toArray(IntFunction<T[]> generator) { * return toArray(generator.apply(0)); } */

		List<String> strList = new ArrayList<>();
		strList.add("Java");
		strList.add("Python");
		strList.add("Android");

		String[] strArray = strList.toArray(size -> new String[size]);
		System.out.println(Arrays.toString(strArray));

		strArray = strList.toArray(size -> new String[size + 5]);
		System.out.println(Arrays.toString(strArray));

		strArray = strList.toArray(size -> new String[size * 3]);
		System.out.println(Arrays.toString(strArray));
	}

}
複製代碼

輸出:

[Java, Python, Android] [Java, Python, Android, null, null] [Java, Python, Android]

13.總結類中的收集類

下表提供了經常使用集合類的基本詳細信息。

在這裏插入圖片描述
在這裏插入圖片描述
相關文章
相關標籤/搜索