1. 程式人生 > >Java集合類原始碼閱讀之AbstractCollection

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