Java集合類原始碼閱讀之AbstractCollection
private static <T> T[] finishToArray(T[] r, Iterator<?> it) { int i = r.length; while (it.hasNext()) { int cap = r.length; if (i == cap) { int newCap = cap + (cap >> 1) + 1; // overflow-conscious code if (newCap - MAX_ARRAY_SIZE > 0) newCap = hugeCapacity(cap + 1); r = Arrays.copyOf(r, newCap); } r[i++] = (T)it.next(); } // trim if overallocated return (i == r.length) ? r : Arrays.copyOf(r, i); }
該方法的兩個引數r和it分別是toArray方法中放置集合元素的物件陣列和迭代器
r.length獲取的就是toArray方法中呼叫size()方法獲取的初始陣列大小,進入while迴圈(即在toArray方法結束的時候發現迭代器中元素比預期的要多),int cap = r.length,此時if判斷成立,即第一次進入該while迴圈,那麼就會分配一個更大的陣列(增加一半的大小,注意可能會溢位,這裡處理了分配超大陣列的情況),然後將原來陣列r中的元素拷貝到新陣列中,後續將元素放置在擴容陣列中,一旦超過,還會繼續分配大陣列。最後只返回i個元素(即迭代器中元素個數)對應的陣列
相關推薦
Java集合類原始碼閱讀之AbstractCollection
private static <T> T[] finishToArray(T[] r, Iterator<?> it) { int i = r.length; while (it.hasNext()) { int cap = r.
java集合類學習筆記之LinkList
prev strong 內部數據 ins 屬性 aced 裏的 row return 1、簡述 LinkList的底層其實就是一個雙向鏈表,所謂的鏈表就是一個LinkList內部靜態靜態類(Node),對LinkList的所有操作本質上就是通過對LinkList中新
java集合類學習筆記之LinkedHashMap
super 增長 remove sta extend red for normal 順序 1、簡述 LinkedHashMap是HashMap的子類,他們最大的不同是,HashMap內部維護的是一個單向的鏈表數組,而LinkedHashMap內部維護的是一個雙向的鏈
Java集合類原始碼解析:AbstractMap
目錄 引言 原始碼解析 抽象函式entrySet() 兩個集合檢視 操作方法 兩個子類 參考: 引言 今天學習一個Java集合的一個抽象類 AbstractMap ,AbstractMap 是Map介面的 實現類之一,也是HashMap、T
Java集合類原始碼解析:HashMap (基於JDK1.8)
目錄 前言 HashMap的資料結構 深入原始碼 兩個引數 成員變數 四個構造方法 插入資料的方法:put() 雜湊函式:hash() 動態擴容:resize() 節點樹化、紅黑樹的拆分 節點樹化
Java集合類原始碼解析:Vector
引言 之前的文章我們學習了一個集合類 ArrayList,今天講它的一個兄弟 Vector。 為什麼說是它兄弟呢?因為從容器的構造來說,Vector 簡直就是 ArrayList 的翻版,也是基於陣列的資料結構,不同的是,Vector的每個方法都加了 synchronized 修飾符,是執行緒安全的。 類
java集合類原始碼詳解-LinkedList(4)-基於JDK8
LinkedList 裡面還有個具有新增功能的函式,上回學漏了,這回補上。 它就是linkBefore()------在一個非空節點前,插入資料 這裡打上個斷點 點選下一步。先把size除二 ,去比較。具體的這個node()方法,我們之前學過,這裡跳過。這個方法,其實就
Java集合類原始碼解析:ArrayList
目錄 前言 今天學習一個Java集合類使用最多的類 ArrayList , ArrayList 繼承了 AbstractList,並實現了List 和 RandomAccess 等介面, public class ArrayList<E> extends AbstractList<E>
java集合類原始碼詳解-ArrayList(2)
上次關於ArrayList的結構沒有做總結。這次還是補充在自己部落格裡面吧。 ArrayList繼承自一個抽象類。實現了四個介面。 AbstractList繼承自AbstractCollection。AbstractCollection繼承自Object。 ArrayL
Java集合類原始碼解析:LinkedHashMap
前言 今天繼續學習關於Map家族的另一個類 LinkedHashMap 。先說明一下,LinkedHashMap 是繼承於 HashMap 的,所以本文只針對 LinkedHashMap 的特性學習,跟HashMap 相關的一些特性就不做進一步的解析了,大家有疑惑的可以看之前的博文。 深入解析 LinkedH
java集合類原始碼詳解-ArrayList(5)
上次,測試了java集合類支援遍歷方式的效率比較,今天再通過斷電除錯,去ArrayList底層的迭代器做了什麼。 首先在迭代器這裡打上斷電,(在實際中變數ArrayList最後別用迭代器,因為他很慢) 可以看到這個iterator()方法返回值是一個迭代器,函式體是r
java集合類原始碼詳解-ArrayList(1)
最近在瘋狂的補基礎 在java中 最重要的知識之一 非集合類莫屬。這次在學習java集合類原始碼,採用的是傳統的方法,斷點除錯和寫測試程式碼。由於是剛開始接觸java集合類原始碼。所以一開始只寫了兩句程式碼來測試,畢竟原始碼學習是很緩慢的過程。只能慢慢的啃。在閱
java集合類深入分析之HashSet, HashMap
Map和Set是比較常用的兩種資料結構。我們在平常的程式設計中經常會用到他們。只是他們的內部實現機制到底是怎麼樣的呢?瞭解他們的具體實現對於我們如何有效的去使用他們也是很有幫助的。這裡主要是針對Map, Set這兩種型別的資料結構規約和典型的HashMap,HashSet實現做一個討論。 Map
java集合類深入分析之TreeMap/TreeSet篇
轉載自:http://shmilyaw-hotmail-com.iteye.com/blog/1836431 簡介 TreeMap和TreeSet算是java集合類裡面比較有難度的資料結構。和普通的HashMap不一樣,普通的HashMap元素
Java集合類:AbstractCollection原始碼解析
一、Collection介面 從《Java集合:整體結構》一文中我們知道所有的List和Set都繼承自Collection介面,該介面類提供了集合最基本的方法,雖然List介面和Set等都有一些自己獨有的方法,但是基本的操作類似。我們先看下Collectio
java集合類源碼分析之List(一)
col 實現類 並且 link arraylist oar print 適用於 for 首先分析一下集合與數組的區別:1.java中的數組一般用於存儲基本數據類型,而且是靜態的,即長度固定不變,這就不適用於元素個數未知的情況;2.集合只能用於存儲引用類型,並且長度可變,
java集合類源碼分析之List(二)
頻繁 null 並且 reel closed tco 默認 java集合 進行 這一節主要介紹List接口的幾個實現類的區別: 1.線程安全 Vector是線程安全的,而ArrayList和LinkedList是非線程安全的。從源碼中我們可知,Vector類中的方法大部分
扒一扒系列之開發中常用的Java集合類(ArrayList篇 jdk 1.7)
mda des obj 初始設置 onu util private 內部 會有 關於這個系列,因為開發主要用的是java語言,一直想寫寫java開發中常用的一些類(雖然這才是開始的第三篇>_<),所有就起了“扒一扒”系列。這個系列會有框架
編程開發之--Java集合類繼承與實現必備知識
編程開發 next() int end long dha cos dHash IV 1、LinkedHashSet有序鏈式集合 舉例: long startTime=System.currentTimeMillis(); LinkedHashSet oprTypeSe
java集合類之ArrayList詳解
int() 相等 toa isempty ont ati urn 影響 輸入 一、ArrayList源碼分析 1、全局變量 (1)默認容量(主要是通過無參構造函數創建ArrayList時第一次add執行擴容操作時指定的elementData的數組容量為10) privat