看集合類,那麼就按順序從 List 開始看吧,第一個映入眼簾的就是 AbstractList,從這個圖就已經比較清晰的看到繼承了什麼類,還有什麼類繼承 AbstractList。微信
還能夠補充一點實現的接口,這裏比 AbstractCollection 多了 List 接口,代表本身是集合類中 List 的特性。dom
在 List 接口中,還有三個接口繼承了的List 接口 ObservableList<E>, ObservableListValue<E>, WritableListValue<E>,以前寫代碼可能就關注了 List 接口,下次去了解這三個接口作了什麼事情。序列做爲有序的集合,該接口的用戶能夠精確地控制在列表中插入每一個元素的位置,用戶能夠經過其整數索引(在列表中的位置)訪問元素,並搜索列表中的元素。其中有趣的是注意到建立不可變 List 的工廠方法 List.of() ,重載寫了這麼多實現幹嗎。裏面的元素是不能夠改的,不然會拋出 UnsupportedOperationException,可是元素自己是可變的除外。做者還在文檔裏指出"它們是以值爲基礎的。調用方不該該對返回實例的標識作出任何假設。工廠方法能夠自由地建立新實例或重用現有實例。所以,對這些實例的身份敏感操做(=、哈希代碼和synchronization)是不可靠的,應該避免。"編碼
能夠看到這個工廠方法實際是由 ImmutableCollections 類的靜態方法實現的,咱們拿其中一個代碼先看看。能夠看到咱們返回的實際上是 List1 這個繼承了 AbstractImmutableList,這個AbstractImmutableList 裏定義了一些方法,因此這裏沒有的方法就會拋出那個異常。不過定義這麼多 List1 2 3 4 5 6 ......幹嗎,後面還有一個不肯定參數的方法,我尚未 get 這裏的點。設計
而後咱們還能夠看一下不肯定參數數量的時候是怎麼樣的,其實 ImmutableCollections 裏面還有其餘集合的不可變方法,下次應該還會看到。如今接口有了 default ,做者好像都把一些接口往上層挪,應該是爲了複用和維護考慮吧。3d
回到 AbstractList ,咱們能夠看到裏面實現了哪些方法 ,這樣繼承的類通常是不用再實現了,直接就能夠用了。對象
讓咱們看看幾個方法吧,就是查這個元素在序列中有沒有,若是沒有那麼返回 -1 ,至於 -1 有什麼特殊含義呢?blog
這個方法裏面比較重要的是獲取 ListIterator 吧,裏面就是如下這幾個經濟實用的方法,固然這個繼承的也是 Iterator 接口。固然默認這裏傳入的是0,也會對index 的範圍作一個檢驗rangeCheckForAdd(index);,而後運行 new ListItr(index)。繼承
其實這裏返回的 ListItr ,一個實現了 ListIterator 接口和 Itr 的靜態內部類索引
在 Itr 中主要看看咱們常常在編碼中使用的 next()接口
能夠看到在這些方法在執行前都會有一個驗證的邏輯,這裏是不加鎖的,咱們下次再來理理大神是怎麼處理的,用來判斷數據變更是怎麼控制的。
這裏先驗證了 subListRangeCheck,而後根據是否實現了 RandomAccess 來調用不一樣的實現,下次看看 RandomAccess 的神奇之處。
而後來看看 equals 方法是怎麼實現了,能夠了解在 ACM 簡單題中都會有比較兩個 List 是怎麼實現的。第一步比較二者是否同一個對象,而後看是不是否 List (驗明正身),繼續得到兩個迭代器,由於入參是 Object 因此 ListIterator<?> 中用 ? 來代替,在比較最短長度的 List 都是否相同後,再比較長的那個是否還有元素,若是相等就相等了。可能我秒速的比較籠統,不知道講清楚了沒。
再看看 List 是怎麼計算 hashCode,遍歷其中的元素一一計算累加,這裏用的31也是挺有趣的2的5次方減1
在集合類的設計中,用到了不少靜態的內部類,雖然看着是難看了一點!
有什麼討論的內容,能夠加我微信公衆號: