啃透JDK源碼系列-Arrays核心源碼解析

      網友投稿 680 2025-04-01

      不知道自己無知,乃是雙倍的無知。


      ——柏拉圖

      0 前言

      此類包含用于操縱數組的各種方法(例如排序和搜索)。 此類還包含一個靜態工廠,該工廠允許將數組視為列表。

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

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

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

      1 繼承體系

      啃透JDK源碼系列-Arrays核心源碼解析

      正如你所見,此類不繼承,不實現任何接口或者類.開箱即用.

      2 構造方法

      private 修飾,這意味著Arrays類不能被實例化

      3 屬性

      最小數組長度,低于該最小數組長度,并行排序算法將不會進一步劃分排序任務。 使用較小的大小通常會導致跨任務的內存爭用,從而導致并行加速的可能性不大

      調整參數:列表大小等于或小于該列表大小的插入排序優先于 mergesort。在將來的 JDK 版本中會被刪除。

      4 復制

      4.1 Arrays#copyOf

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

      對于在原始數組和副本中均有效的所有索引,兩個數組將包含相同的值

      對于在副本中有效但在原始副本中無效的任何索引,副本將包含0

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

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

      4.2 System#copyOf

      從指定的源數組(從指定位置開始)復制數組到目標數組的指定位置。數組元素的子序列從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

      數組打印

      即通過 StringBuilder將數組內容拼接打印出來。

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

      6 equals

      數組相同判斷

      就是對數組中對應元素分別進行比較是否相同

      示例:注意與 Objects中的equals方法不同

      7 asList

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

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

      注意,此處返回的 ArrayList 并非常用的 java.util.ArrayList,而是 Arrays 的一個靜態內部類

      該內部類中沒有add和remove方法,不支持添加和移除等操作。

      8 hashCode

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

      9 總結

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

      Java JDK 數據結構

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:表格在線預覽
      下一篇:apaas和apaas(APaas)
      相關文章
      亚洲国产精品一区| 亚洲AV无码一区二区乱孑伦AS | 亚洲午夜成人精品无码色欲| 久久狠狠高潮亚洲精品| 久久久久久a亚洲欧洲aⅴ| 国产精品亚洲二区在线观看| 亚洲一本大道无码av天堂| 亚洲成人一区二区| 亚洲精品乱码久久久久久蜜桃| 亚洲国产日韩成人综合天堂| 亚洲情a成黄在线观看| 亚洲午夜福利精品无码| 美腿丝袜亚洲综合| 人人狠狠综合久久亚洲婷婷| 亚洲AV午夜福利精品一区二区| 亚洲爆乳无码一区二区三区| 亚洲Av综合色区无码专区桃色| 久久九九亚洲精品| 亚洲国产人成在线观看69网站| 亚洲视频在线观看免费视频| 亚洲国产成人精品无码一区二区 | 亚洲区小说区图片区| 久久久久亚洲精品男人的天堂| 亚洲永久精品ww47| 久久青青草原亚洲AV无码麻豆| 亚洲国产精品线在线观看| 亚洲精品视频免费看| 亚洲不卡视频在线观看| 亚洲中文字幕无码爆乳| 中文日韩亚洲欧美制服| 亚洲第一成年免费网站| 亚洲成a人片在线观看国产| 亚洲精品在线视频| 久久久久久a亚洲欧洲aⅴ| 亚洲av无码潮喷在线观看 | 亚洲综合自拍成人| 亚洲免费视频观看| 亚洲日本中文字幕天天更新| 国产精品亚洲а∨天堂2021| 亚洲成a人无码av波多野按摩| 亚洲综合熟女久久久30p|