天天看點

啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結

0 前言

此類包含用于操縱數組的各種方法(例如排序和搜尋)。 此類還包含一個靜态工廠,該工廠允許将數組視為清單。

如果指定的數組引用為null,則除非另有說明,否則此類中的方法都抛出NullPointerException。

此類中所包含方法的文檔包括對實作的簡要說明。 此類描述應被視為實作的說明,而不是标準。隻要遵守規範本身,實作者就可以随意替換其他算法.(例如sort(Object[] 使用的算法不必是MergeSort,但必須是穩定的。)

此類是Java Collections Framework的成員。在 JDK1.2 時提供.

1 繼承體系

  • 正如你所見,此類不繼承,不實作任何接口或者類.開箱即用.
  • 啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結

2 構造方法

  • private 修飾,這意味着Arrays類不能被執行個體化
  • 啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結

3 屬性

  • 最小數組長度,低于該最小數組長度,并行排序算法将不會進一步劃分排序任務。 使用較小的大小通常會導緻跨任務的記憶體争用,進而導緻并行加速的可能性不大
  • 啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結
  • 調整參數:清單大小等于或小于該清單大小的插入排序優先于 mergesort。在将來的 JDK 版本中會被删除。
  • 啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結

4 複制

4.1 Arrays#copyOf

複制指定的數組,截斷或填充零(如果需要),以使副本具有指定的長度。

  • 對于在原始數組和副本中均有效的所有索引,兩個數組将包含相同的值
  • 對于在副本中有效但在原始副本中無效的任何索引,副本将包含0

    隻有當指定長度大于原始數組的長度時,此類索引才會存在

啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結

從源碼中可以看到 Arrays 的拷貝方法,實際上最終調用的還是 System.arraycopy 這個本地方法。

4.2 System#copyOf

啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結

從指定的源數組(從指定位置開始)複制數組到目标數組的指定位置。數組元素的子序列從src引用的源數組複制到dest引用的目标數組。複制的元素數等于length參數。将源數組中 srcPos 到 srcPos+length-1 位置的分量分别複制到目标數組的 destPos 到 destPos+length-1 位置

如果src和dest參數引用相同的數組對象,則執行複制,就好像首先将srcPos到 srcPos+length-1 位置上的元素複制到具有 length 個元素的臨時數組,然後将臨時數組的内容通過目标數組的 destPos+length-1 複制到位置destPos。

如果dest為null,則抛出NullPointerException。

如果src為null,則抛出NullPointerException,并且不修改目标數組。

如果滿足以下任一條件,則将引發ArrayStoreException并且不會修改目标:

src參數引用的對象不是數組

dest參數引用的對象不是數組。

src參數和dest參數引用其元素類型為不同基本類型的數組。

src參數引用具有原始元素類型的數組,而dest參數引用具有引用元素類型的數組

src參數引用具有引用元素類型的數組,而dest參數引用具有原始元素類型的數組

如果滿足以下任一條件,則将抛出IndexOutOfBoundsException,并且不會修改目标:

srcPos參數為負。

destPos參數為負。

length參數為負

srcPos + length大于源數組的長度src.length

destPos + length大于目标數組的長度dest.length

5 toString

數組列印

啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結

即通過 StringBuilder将數組内容拼接列印出來。

注意此處的Arrays.toString()方法是Arrays類自己定義實作的靜态方法,而不是Object的toString()方法。

啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結

6 equals

數組相同判斷

  • 就是對數組中對應元素分别進行比較是否相同
  • 啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結
  • 示例:注意與 Objects中的equals方法不同
  • 啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結

7 asList

将數組轉為List,該方法與集合的toArray方法一起充當了建構數組和集合之間的橋梁.

該方法還提供了一種很便捷的方法來建立一個初始化大小的清單,該清單初始化包含幾個元素:

注意,此處傳回的 ArrayList 并非常用的 java.util.ArrayList,而是 Arrays 的一個靜态内部類

啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結
  • 該内部類中沒有add和remove方法,不支援添加和移除等操作。

8 hashCode

啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結

擷取數組的hashCode值,該值是基于數組的每一個元素的hashCode來實作的。一般來說,hashCode方法隻計算到數組的第一層,如果數組中還内嵌數組,deepHashCode方法則會一直遞歸調用到數組無法再拆分為止。

啃透JDK源碼系列-Arrays核心源碼解析0 前言1 繼承體系2 構造方法3 屬性4 複制5 toString6 equals7 asList8 hashCode9 總結

9 總結

Arrays 是 JDK 專為友善操作數組提供的工具類.大家務必搞懂,如果有任何疑惑及感想,歡迎評論區留言!