1. JDK中集合的輔助類

JDK中集合的輔助類

這裏討論的主要有j.u.Collectionsj.u.Arrays兩個類,分別對應集合與數組。在實際開發中可能或多或少已經用過這兩個類,如今讓咱們看看裏面還有哪些可用的方法吧。面試

Collections的方法

  1. 兩個排序。sort(…) 一個是要求List的容器中元素已經實現了j.l.Comparable<T>類,內部調用的是Arrays.sort(…),而後從新賦值。 而j.l.Comparable<T>接口中只有一個compareTo(T a)方法,實現了這個類,就能夠調用這個方法,進行簡單排序。 另外一個必須傳入一個比較器實例,實現了j.u.Comparator<T>接口的類,其內部也是調用Arrays.sort(…),有點須要注意的是這裏是典型的策略模式
  2. 二分查找。須要內部的list實現j.l.Comparable接口,而且是有序的。binarySearch(…) 根據傳入的參數是否支持隨機訪問(經過實現RandomAccess接口),分別來分發到indexedBinarySearch(…)iteratorBinarySearch(…),能夠看到不支持隨機訪問的iteratorBinarySearch(…)只能開始一個個遍歷到index位置,效率有點慢。
  3. 反序。reverse(…)能夠將List元素相反的順序從新排列。
  4. 洗牌。shuffle(…)將全部List元素順序隨機打亂。這個算法在網上有面試題,下次能夠直接調用JDK算法。
  5. 交換。swap(…)交換List的兩個元素。
  6. 填充。fill(…)用一個元素填充一個List,可是要注意List的size。
  7. 複製。copy(…)將一個List元素從一個List交複製到另外一個List。
  8. 求最小值。min(…)求容器元素實現了j.l.Comparable接口的Collection中最小的值,比值操做函數是compareTo
  9. 求最大值,max(…)與求最小值相相似。
  10. 反轉。rotate(…),能夠這樣理解,就是將一個List的頭與尾巴連接,造成一個環,而distance表示後退distance步,而後斷開環。 rotate({1,2,3,4} ,1)-> ({4,1,2,3})
  11. 替換元素。replaceAll(…),這個比較容易理解。
  12. 子集合位置。indexOfSubListlastIndexOfSubList(…),求子集合第一次與最後一次出現的位置。
  13. 集合互斥。disjoint(…),也就是判斷兩個集合有沒有交際。
  14. 出現次數。frequency(…),統計一個元素在集合中出現的次數。
  15. 反向排序比較器。reverseOrder(…),返回一個反向排序比較器,反序排列的時候可用。

Collections中的內部類。

  1. Checked系列。包括CheckedCollectionCheckedListCheckedMapCheckedRandomAccessListCheckedSetCheckedSortedMapCheckedSortedSet。 做用是對集合的容器元素作類型的限制,由於在集合的傳遞中,可能出現泛型的擦除,能夠看看這篇文章
  2. Empty系列。包括EmptyEnumerationEmptyListEmptyMapEmptySet。 空的集合,大小不可變,下降對系統資源的消耗,如在查詢數據庫時,沒有數據或出錯的時候返回一個默認List值,這時候能夠用EmptyList。參考可見這篇文章。內部實現readResolve()用於對單例模式的保護.
  3. Singleton系列。SingletonListSingletonMapSingletonSet。只有一個元素的集合,大小不可變。做用……嗯……就是這個集合只准有一個元素……好吧,我也不知道有其餘的用處……
  4. Unmodifiable系列。UnmodifiableCollectionUnmodifiableListUnmodifiableMapUnmodifiableRandomAccessListUnmodifiableSetUnmodifiableSortedMapUnmodifiableSortedSet。不可修改的集合,外表與不可變集合同樣,可是一般須要另外一個集合初始化,而這個傳入的集合能夠是可修改的,相似代理模式吧,能夠看看這篇文章
  5. Synchronized系列。SynchronizedCollectionSynchronizedListSynchronizedMapSynchronizedRandomAccessListSynchronizedSetSynchronizedSortedMapSynchronizedSortedSet。線程安全的集合,須要傳入一個集合(也可傳入要鎖對象),內部就是對鎖對象加鎖,而後進行對集合的操做。和上面的有些相似,代理模式。注意的是,線程安全是對SynchronizedCollection等而言,對於初始化時傳入的集合,若是直接對他進行操做也是不安全的。

Collections的JDK8

沒有太大變動,最明顯的是各內部子類增長了stream相關接口。算法

Arrays的方法

  1. 數組變列表。asList(…),這是你們最經常使用的吧,可是要注意,他返回的ArrayList是他的一個內部類,而不是常見的j.u.ArrayList
  2. 二分查找系列。binarySearch(…)。能給各類數組查找,可是前提是他們得是有序的。
  3. 定長複製。copyOf(…), 從入參original拷貝出newLength長度的數組(若是不足就取original的長度)。調用的是System.arraycopy(…)
  4. 範圍複製。copyOfRange(…), 從入參original拷貝出to - from長度的數組。內部調用的是System.arraycopy(…)
  5. 深度相等。deepEquals(…),對全部容器元素作equals(…),若是數組元素是數組那麼遞歸deepEquals(…)
  6. 深度字串化。deepToString(…),將循環調用數組(A)數組元素的toString(…)方法,若是數組元素是數組(B),那麼會再次循環調用此數組(B)數組元素的toString(…)方法,但不會在數組(B)上調用deepToString(…)
  7. 數組相等。equals(…),將兩個入參數組a與a2的全部元素逐個對比。包括順序。
  8. 填充。fill(…),將一個數組a填充val值,你可也以制定填充的開始位置與結束位置。
  9. 哈希值。hashCode(…),獲得一個數組的哈希值,他與數組的元素與順序相關。
  10. 深度哈希值。deepToString(…),與hashCode(…)不一樣,若是數組元素是數組,那麼就會遞歸調用deepToString(…)
  11. 排序。sort(…),快速排序,內部調用的是j.u.DualPivotQuicksort類,感興趣的能夠看看。
  12. 字串化。toString(…),將循環調用數組(A)數組元素的toString(…)方法。

Arrays的內部類

  1. ArrayList類,與j.u.ArrayList同名,Arrays.asList(…)的時候返回的就是這個類實例,注意不要給j.u.ArrayList了。

Arrays的JDK8

  1. 前綴相累,parallelPrefix(…),根據傳入的表達式,對傳入的數組進行演算,將上次演算的結果作爲下次演算的一個因子,將此因子與數組下標對應的元素再次演算,如此循環,將每次若是放到新數組中。parallel表示他是並行的。
  2. 並行排序,parallelSort(…),並行排序,將數組分紅小數組,分別排序,而後合併。他內部有一個閾值,若是不到並行排序的條件就會降級成sort(…)
  3. 設值全部,setAll(…),根據傳入的表達式對全部數組元素進行演算,並設值。
  4. 並行設值全部,parallelSetAll(…),上面函數的並行版本。
  5. 流化。stream(…),將傳入的數組,流化。嗯,對,就叫流化……
  6. spliterator(…),聽說是splite版本的iterator,我沒有看懂,你們看看吧。
相關文章
相關標籤/搜索