這裏討論的主要有j.u.Collections
與j.u.Arrays
兩個類,分別對應集合與數組。在實際開發中可能或多或少已經用過這兩個類,如今讓咱們看看裏面還有哪些可用的方法吧。面試
sort(…)
一個是要求List的容器中元素已經實現了j.l.Comparable<T>
類,內部調用的是Arrays.sort(…)
,而後從新賦值。 而j.l.Comparable<T>
接口中只有一個compareTo(T a)
方法,實現了這個類,就能夠調用這個方法,進行簡單排序。 另外一個必須傳入一個比較器實例,實現了j.u.Comparator<T>
接口的類,其內部也是調用Arrays.sort(…)
,有點須要注意的是這裏是典型的策略模式。j.l.Comparable
接口,而且是有序的。binarySearch(…)
根據傳入的參數是否支持隨機訪問(經過實現RandomAccess
接口),分別來分發到indexedBinarySearch(…)
與iteratorBinarySearch(…)
,能夠看到不支持隨機訪問的iteratorBinarySearch(…)
只能開始一個個遍歷到index
位置,效率有點慢。reverse(…)
能夠將List元素相反的順序從新排列。shuffle(…)
將全部List元素順序隨機打亂。這個算法在網上有面試題,下次能夠直接調用JDK算法。swap(…)
交換List的兩個元素。fill(…)
用一個元素填充一個List,可是要注意List的size。copy(…)
將一個List元素從一個List交複製到另外一個List。min(…)
求容器元素實現了j.l.Comparable
接口的Collection中最小的值,比值操做函數是compareTo
。max(…)
與求最小值相相似。rotate(…)
,能夠這樣理解,就是將一個List的頭與尾巴連接,造成一個環,而distance
表示後退distance
步,而後斷開環。 rotate({1,2,3,4} ,1)-> ({4,1,2,3})
replaceAll(…)
,這個比較容易理解。indexOfSubList
與lastIndexOfSubList(…)
,求子集合第一次與最後一次出現的位置。disjoint(…)
,也就是判斷兩個集合有沒有交際。frequency(…)
,統計一個元素在集合中出現的次數。reverseOrder(…)
,返回一個反向排序比較器,反序排列的時候可用。CheckedCollection
、CheckedList
、CheckedMap
、CheckedRandomAccessList
、CheckedSet
、CheckedSortedMap
、CheckedSortedSet
。 做用是對集合的容器元素作類型的限制,由於在集合的傳遞中,可能出現泛型的擦除,能夠看看這篇文章。EmptyEnumeration
、EmptyList
、EmptyMap
、EmptySet
。 空的集合,大小不可變,下降對系統資源的消耗,如在查詢數據庫時,沒有數據或出錯的時候返回一個默認List值,這時候能夠用EmptyList。參考可見這篇文章。內部實現readResolve()
用於對單例模式的保護.SingletonList
、SingletonMap
、SingletonSet
。只有一個元素的集合,大小不可變。做用……嗯……就是這個集合只准有一個元素……好吧,我也不知道有其餘的用處……UnmodifiableCollection
、UnmodifiableList
、UnmodifiableMap
、UnmodifiableRandomAccessList
、UnmodifiableSet
、UnmodifiableSortedMap
、UnmodifiableSortedSet
。不可修改的集合,外表與不可變集合同樣,可是一般須要另外一個集合初始化,而這個傳入的集合能夠是可修改的,相似代理模式吧,能夠看看這篇文章SynchronizedCollection
、SynchronizedList
、SynchronizedMap
、SynchronizedRandomAccessList
、SynchronizedSet
、SynchronizedSortedMap
、SynchronizedSortedSet
。線程安全的集合,須要傳入一個集合(也可傳入要鎖對象),內部就是對鎖對象加鎖,而後進行對集合的操做。和上面的有些相似,代理模式。注意的是,線程安全是對SynchronizedCollection
等而言,對於初始化時傳入的集合,若是直接對他進行操做也是不安全的。沒有太大變動,最明顯的是各內部子類增長了stream相關接口。算法
asList(…)
,這是你們最經常使用的吧,可是要注意,他返回的ArrayList
是他的一個內部類,而不是常見的j.u.ArrayList
。binarySearch(…)
。能給各類數組查找,可是前提是他們得是有序的。copyOf(…)
, 從入參original
拷貝出newLength
長度的數組(若是不足就取original的長度)。調用的是System.arraycopy(…)
。copyOfRange(…)
, 從入參original
拷貝出to - from
長度的數組。內部調用的是System.arraycopy(…)
。deepEquals(…)
,對全部容器元素作equals(…)
,若是數組元素是數組那麼遞歸deepEquals(…)
。deepToString(…)
,將循環調用數組(A)數組元素的toString(…)
方法,若是數組元素是數組(B),那麼會再次循環調用此數組(B)數組元素的toString(…)
方法,但不會在數組(B)上調用deepToString(…)
。equals(…)
,將兩個入參數組a與a2的全部元素逐個對比。包括順序。fill(…)
,將一個數組a填充val值,你可也以制定填充的開始位置與結束位置。hashCode(…)
,獲得一個數組的哈希值,他與數組的元素與順序相關。deepToString(…)
,與hashCode(…)
不一樣,若是數組元素是數組,那麼就會遞歸調用deepToString(…)
。sort(…)
,快速排序,內部調用的是j.u.DualPivotQuicksort
類,感興趣的能夠看看。toString(…)
,將循環調用數組(A)數組元素的toString(…)
方法。j.u.ArrayList
同名,Arrays.asList(…)
的時候返回的就是這個類實例,注意不要給j.u.ArrayList
了。parallelPrefix(…)
,根據傳入的表達式,對傳入的數組進行演算,將上次演算的結果作爲下次演算的一個因子,將此因子與數組下標對應的元素再次演算,如此循環,將每次若是放到新數組中。parallel表示他是並行的。parallelSort(…)
,並行排序,將數組分紅小數組,分別排序,而後合併。他內部有一個閾值,若是不到並行排序的條件就會降級成sort(…)
。setAll(…)
,根據傳入的表達式對全部數組元素進行演算,並設值。parallelSetAll(…)
,上面函數的並行版本。stream(…)
,將傳入的數組,流化。嗯,對,就叫流化……spliterator(…)
,聽說是splite版本的iterator,我沒有看懂,你們看看吧。