JDK核心源碼


 一、核心包有哪些?

  Jdk的包中,除開了lang包下面的類,用得最多的應該要屬於util包下面的類了,

  本篇文章主要針對Jdk的util包下面的類(util目錄下面的類,暫時不包括util 包下面的子包,子包將在后面繼續進行)進行一個總結,

  主要是用來幫助大家進行梳理知識,讓大家對jdk的代碼更加熟悉。

  Util包里面主要就是常見的集合類和常見的工具類,集合類就是一些常見的數據結構的實現,工具類就是一些常見的數學、時間、字符串等操作的方法類。

 


 

二、集合類:

  下面先針對集合類來進行分析:集合類主要分成了三類集合:隊列類型、集合類型、哈希類型。

  1、隊列類型,它是一種線性的數據結構

  (1)ArrayList:

    底層存儲是通過數組進行存儲的,所以他可以直接通過數組下標進行訪問,所以隨機訪問速度很快。

    但是在擴容方面效率很低,他需要把數據進行重新進行拷貝。

  (2)LinkedList:

    底層是通過鏈表進行存儲的,他不能支持隨機訪問,只能從頭節點或者尾節點進行遍歷,增加元素成本很低,不存在拷貝數據的操作。

  (3)Vector:

    底層存儲和ArrayList一樣是通過數組進行存儲的,但是它的方法是同步操作的,所以說他是線程安全的,

    性能方面差於ArrayList,擴容方面Vector元素是翻倍,是要多於ArrayList的50%的增長率。

  (4)Stack:

    是Vector的子類,他是實現棧的操作,只有push、pop、peek幾個操作,他也是線程安全的類

  (5)ArrayDeque:

    底層存儲室通過數組進行存儲的雙端隊列,擁有一個頭指針和一個尾指針,當頭指針和尾指針在同一個位置的時候,會進行翻倍擴容。

    同時他支持棧和隊列的操作,但是不支持隨機訪問。

  (6)PriorityQueue:

    默認是基於堆的數據結構進行實現的,默認是可以取到最小的值,如果最小值有多個,則是隨機選取,

    然后可以通過設置Comparator接口進行排序。內部是用數組進行存儲的,但是除開第一個元素,后面的元素是沒有順序的。

  2、集合類型,它是一種非線性的數據結構,但是集合里面只會保留一個相同的元素

  (1)HashSet:

    底層通過HashMap進行存儲,里面不允許重復的值,是一種最常用的集合類的數據結構

  (2)EnumSet:

    是一個枚舉類型的集合,它里面的元素必須全部來自單個枚舉類型,在內部所有元素只占長整型的一位,所以時間和空間性能相當的好。

  (3)LinkedHashSet:

     它是繼承於HashSet的,但是它保證了插入元素的插入順序,所以能夠保證迭代時候的順序和插入時候的順序保持一致。

  (4)TreeSet:

    它是基於樹型結構來構造的集合,它底層通過TreeMap來進行存儲,

    又因為TreeMap是基於數據結構里面的紅黑樹,所以它內部的元素是可以進行排序的。    

    因為結構是樹形結構,所以在讀取或者寫入的速度方面要慢於HashSet。

  3、哈希類型,它是一種key-value的結構,可以通過key可以快速定位到value

  (1)HashMap:

    最常用的Map結構,它是通過數組加鏈表的形式進行存儲的。

  (2)EnumMap:

    枚舉類型的Map結構,它的key是一個枚舉類型,它效率要高於HashMap,因為它內部是只有數組進行存儲的,可以通過直接定位到具體元素,

    而不用像上面的HashMap去進行計算,所以效率比HashMap要大大提高。

  (3)IdentityHashMap:

    它可以保存多個一樣值的key,只有當k1==k2的時候才認為是重復的。然后進行查找的時候,也是根據具體的key地址進行查找,

    而不是通過key的值進行查找的。

  (4)LinkedHashMap:

    類似於HashMap,但是能夠保證迭代時候的順序和插入時候的順序保持一致。

  (5)TreeMap:

    它基於樹型結構來存儲的,樹形結構是基於數據結構里面的紅黑樹,所以它內部的元素也是可以進行排序的。

  (6)HashTable:

    它類似於HashMap, 區別就是HashTable是一個線程安全的,同時它的key和value都是不能為null的。

  (7)Properties:

    繼承於HashTable,所以它也是線程安全的,並且可以通過io操作來讀取文件里面的內容,來構成Properties對象。

  (8)WeakHashMap:

    它里面的key都是弱引用的哈希實現,對於一個給定的鍵,其映射的存在並不阻止垃圾回收器對該鍵的丟棄,

    這就使該鍵成為可終止的,被終止,然后被回收。某個鍵被終止時,它對應的鍵值對也就從映射中有效地移除了。

    它是通過ReferenceQueue來進行實現的,這個是前面的lang包里面的類。其他方面和HashMap沒有差別。


 

三、工具類:

  上面總結講完了util包里面的集合類,下面針對util包里面的工具類進行講解

  1、對象工具類:

    Objects類主要用於操作單個對象,Arrays類主要用於操作數組對象,Collections類主要用於操作集合類對象。

  2、貨幣工具類:

    Currency是用於操作各國不同類型的貨幣的類。

  3、時間工具類:

    Date、Calendar和SimpleTimeZone主要是之前遺留下來的類,

    但是到了JDK1.8之后,jdk包里面增加了專門處理時間的time包來處理時間操作,所以在JDK1.8之后不建議使用這些老的時間操作類了。

  4、字符串工具類:

    主要用來進行字符串分割、連接和格式化的操作的類

  5、數學工具類:

    主要用於進行對於數字類的集合進行操作,計算各種數據(比如最大、最小、平均值、總和等數據)

  6、算法工具類:

    常用的算法操作封裝(隨機算法、UUID算法、Base64算法、位圖算法等)。

  7、定時器類:

    完成簡單的定時任務的Timer類

  8、Optional類:

     JDK1.8新加的類,主要用於避免空指針而引入的類,能夠一定程度解決討厭的空指針的問題。

  9、ServiceLoader類:

    它從META-INF/services目錄下的配置文件中加載子類或者接口的實現類,返回一個實例。

    可以通過配置文件來配置具體實現的類,這樣可以具有更好的擴展性。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM