1. 程式人生 > >jdk8原始碼解析第一天(簡化版,只記自己理解的要點)

jdk8原始碼解析第一天(簡化版,只記自己理解的要點)

1.String類:

實現了serilizable,comparable介面,seriliazable僅用於標誌,comparable的comparableTo方法用於比較字串大小。

底層是通過final char[] 實現字串的,其所有方法均是用字元陣列相關方法實現的。

2.ArrayList:

實現了List,RandomAccess,Clone,serilizable介面,ArrayList底層由動態陣列實現,初始陣列長度為0,當第一次新增元素時就會擴容到10,也可以呼叫者自己賦初始陣列容量。(呼叫者如果賦初始容量,那初始容量最小為10,即(呼叫者賦值小於10則初始容量為10).當新增元素到集合大小時擴容到1.5倍。其他ArrayList集合方法效率和陣列特性有關,比如remove方法,需要刪除指定位置的元素,將其後的元素向前移位,這時間複雜度很大的事,所以效率低,同樣的在指定位置插入元素效率同樣低。這就是我們說的ArrayList集合可以快速改查,但是增刪效率低下。

ArrayList是執行緒不安全的原因:當集合add元素時,由需要執行兩步,第一判斷集合容量是否能容下該元素,然後再新增元素,比如集合容量初始容量為10,當集合恰好到9時,一個執行緒判斷集合容量可進行add操作,然後另一個執行緒又進行了判斷可進行add操作,當兩個執行緒都進行了add操作,陣列就越界了。還有一種就是當一個執行緒判斷容量後和另一個執行緒也判斷了容量同時進行插入時,會將陣列的一個角標位賦兩次值,後一次會覆蓋前一次,導致添加了了兩次而集合只添加了一個元素。

object 的toArray()方法可能會出異常的,這是因為多型導致的object[]陣列中可能存的是object子類,當其用toArray()方法時,返回的就是其子類陣列,導致object向下轉型,而向下轉型是有可能會出錯的。

3.LinkedList:

LinkedList 是一個繼承於AbstractSequentialList的雙向連結串列。它也可以被當作堆疊、佇列或雙端佇列進行操作。

LinkedList 實現 List 介面,能對它進行佇列操作。

LinkedList 實現 Deque 介面,即能將LinkedList當作雙端佇列使用。

LinkedList 實現了Cloneable介面,即覆蓋了函式clone(),能克隆。

LinkedList 實現java.io.Serializable介面,這意味著LinkedList支援序列化,能通過序列化去傳輸。

LinkedList 是執行緒不安全的。

LinkedList的訪問特定位置元素,是利用類似折半查詢的方法。因為雙向連結串列只有前驅後繼是沒有角標的,想要查詢到特定位置,只能遍歷。

LinkedList可以快速增刪,這和連結串列的特有性關,再增加或刪除一個元素時,只需改變其和相鄰的元素的前驅後繼。

4.HashSet:

HashSet是基於HashMap實現的,key為出入元素的HashCode,value為存入的元素,因為HashMap的key值不能重複,所以得到了HashSet的不可存入重複元素的特性。所以其特性通過HashMap即可瞭解。HashSet執行緒不安全。

5.HashMap:

HashMap以Entry陣列和連結串列組成的,Entry有四個屬性,key,value,nextEntry,hashCode組成

HashMap初始容量為16,每次擴容加倍,負載因子為0.75,容量為2的倍數是為了保證低位的雜湊均勻。

key ---hashCode()---> hashCode ---hash()---> h --- indexFor() ---> Entry[]下標,hashCode()方法是計算key的hashCode值,hash()方法是將key的hashCode值轉化成一個實際的數字(將hashCode>>>16再與hashCode按位異或)得到一個hash值,indexFor()方法內部是用h和陣列長度-1進行按位與操作,即得到了Entry下標。為了讓Entry陣列每個連結串列儘量均勻分佈,所以hashMap的容量為2的倍數。

有理解不對的地方歡迎大家多多指正。