高級開發必須掌握JDK核心源碼,這裡總有你所不知道的知識點!

數據結構 數學 文章 技術 碼王信息 2017-05-09

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目錄下的配置文件中加載子類或者接口的實現類,返回一個實例。可以通過配置文件來配置具體實現的類,這樣可以具有更好的擴展性。

最後附上一個關於jdk裡面utils包裡面常用類和方法的思維導圖:

高級開發必須掌握JDK核心源碼,這裡總有你所不知道的知識點!

JDK核心util包思維導圖

如果你覺得我們總結的知識可以幫到你,可以到加群: 632109190一起進行學習和討論。

相關推薦

推薦中...