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