1. 程式人生 > >Java ArrayList底層實現原理

Java ArrayList底層實現原理

Vector:
  • 概述
    • 會自動擴容的陣列,執行緒安全
    • 基本與ArrayList一致,只要記住多了執行緒安全,效率低低一點
    • 查詢快,增刪慢
  • 底層實現、
    • Object陣列實現,
    • 預設陣列長度為10,預設的擴容長度是原陣列2倍,也可通過構造器自定義擴容長度
    • 也有modcount值
      • 每次對陣列結構進行改變時,該值都會增加1
      • 在迭代器中會有expectedModCount值,會與此值進行比較,如果一致迭代;不一致,丟擲異常。
      • 簡單校驗,防止迭代期間原始集合改變
  • 方法
    • capacity():底層陣列長度,不是陣列內元素的個數
    • size():元素的個數
1. ArrayList概述:

   ArrayList是List介面的可變陣列的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 List 介面外,此類還提供一些方法來操作內部用來儲存列表的陣列的大小。
   每個ArrayList例項都有一個容量,該容量是指用來儲存列表元素的陣列的大小。它總是至少等於列表的大小。隨著向ArrayList中不斷新增元素,其容量也自動增長。自動增長會帶來資料向新陣列的重新拷貝,因此,如果可預知資料量的多少,可在構造ArrayList時指定其容量。在新增大量元素前,應用程式也可以使用ensureCapacity操作來增加ArrayList例項的容量,這可以減少遞增式再分配的數量。 
   注意,此實現不是同步的。如果多個執行緒同時訪問一個ArrayList例項,而其中至少一個執行緒從結構上修改了列表,那麼它必須保持外部同步。

2. ArrayList的實現:

   對於ArrayList而言,它實現List介面、底層使用陣列儲存所有元素。其操作基本上是對陣列的操作。下面我們來分析ArrayList的原始碼:

   1) 底層使用陣列實現:

  1. privatetransient Object[] elementData;  
2) 構造方法:
   ArrayList提供了三種方式的構造器,可以構造一個預設初始容量為10的空列表、構造一個指定初始容量的空列表以及構造一個包含指定collection的元素的列表,這些元素按照該collection的迭代器返回它們的順序排列的。
  1. public ArrayList() {  
  2.     this
    (10);  
  3. }  
  4. public ArrayList(int initialCapacity) {  
  5.     super();  
  6.     if (initialCapacity < 0)  
  7.         thrownew IllegalArgumentException("Illegal Capacity: "+ initialCapacity);  
  8.     this.elementData = new Object[initialCapacity];  
  9. }  
  10. public ArrayList(Collection<? extends E> c) {  
  11.     elementData = c.toArray();  
  12.     size = elementData.length;  
  13.     // c.toArray might (incorrectly) not return Object[] (see 6260652)
  14.     if (elementData.getClass() != Object[].class)  
  15.         elementData = Arrays.copyOf(elementData, size, Object[].class);  
  16. }  
3) 儲存:
   ArrayList提供了set(int index, E element)、add(E e)、add(int index, E element)、addAll(Collection<? extends E> c)、addAll(int index, Collection<? extends E> c)這些新增元素的方法。下面我們一一講解:
  1. // 用指定的元素替代此列表中指定位置上的元素,並返回以前位於該位置上的元素。
  2. public E set(int

    相關推薦

    Java ArrayList底層實現原理

    Vector:概述 會自動擴容的陣列,執行緒安全基本與ArrayList一致,只要記住多了執行緒安全,效率低低一點查詢快,增刪慢底層實現、 Object陣列實現,預設陣列長度為10,預設的擴容長度是原陣列2倍,也可通過構造器自定義擴容長度也有modcount值 每次對陣列結構進行改變時,該值都會增加1在迭代器

    Java ArrayList底層實現原理原始碼詳細分析Jdk8

    簡介 ArrayList是基於陣列實現的,是一個動態陣列,其容量能自動增長,類似於C語言中的動態申請記憶體,動態增長記憶體。 ArrayList不是執行緒安全的,只能用在單執行緒環境下,多執行緒環境下可以考慮用Collections.synchronizedList(List l)函式返回一個執行緒安全的A

    Java併發程式設計(二)——Java併發底層實現原理

    Java程式碼會被編譯後變成Java位元組碼,位元組碼會被類載入器載入到JVM中,JVM執行位元組碼,最終轉化成彙編指令在CPU上執行,Java中所使用的併發機制依賴於JVM的實現和CPU的指令。 volatile 在多執行緒併發程式設計中,synchronized和volatile

    JAVA HashMap底層實現原理

    1.    HashMap概述:    HashMap是基於雜湊表的Map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。此類不保證對映的順序,特別是它不保證該順序恆久不變。 2.    HashMap的資料結構:    在jav

    Java ArrayList實現原理詳解

    ArrayList是Java List型別的集合類中最常使用的,本文基於Java1.8,對於ArrayList的實現原理做一下詳細講解。 一、ArrayList實現原理總結 ArrayList的實現原理總結如下: ①資料儲存是基於陣列實現的,預設初始容量為10; ②

    java ArrayList實現原理

    1.ArrayList這是我們經常使用到的類,但是對於他是怎麼實現的?我們來看一下: /** * Constructs a new instance of {@code ArrayList} with the specified * initia

    Java中HashMap底層實現原理(JDK1.8)源碼分析

    blank imp dash logs || 屬性 lte das ces 這幾天學習了HashMap的底層實現,但是發現好幾個版本的,代碼不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一樣,原來他們沒有指定JDK版本,很多文章都是舊版本J

    Java並發機制和底層實現原理

    差距 32處理器 們的 trac 結點 exce jdk cep 定性   Java代碼在編譯後會變成Java字節碼,字節碼被類加載器加載到JVM裏,JVM執行字節碼轉化為匯編指令在CPU上執行。Java中的並發機制依賴於JVM的實現和CPU的指令。      Java語言

    併發程式設計的藝術——第二章Java併發機制的底層實現原理

    第一節 volatile的應用 定義:Java程式語言允許執行緒訪問共享變數,為了確保共享變數能被準確和一致地更新,執行緒應該確保通過排他鎖單獨獲得這個變數。 為了提高處理速度,處理器不直接和記憶體進行通訊,而是先將系統記憶體的資料讀到內部快取後再進行操作 在多處理器下, 為了保證各個處

    二、Java併發機制的底層實現原理

    Java程式碼編譯後變成java位元組碼,位元組碼被類載入器載入到JVM裡,JVM執行位元組碼,最終需要轉化為彙編指令在CPU上執行,java中所使用的併發機制依賴於JVM的實現和CPU的執行。 2.1 volatile的應用 在多執行緒併發程式設計中,synchronized和v

    JAVA筆記 —— HashMap(1.7) 底層實現原理

    HashMap 底層實現原理     兩年前,我總覺得很多東西會用就行,不喜歡總結,不喜歡深入瞭解,這或許就是因為當時太懶。一年前,我覺得必須要把在工作積累到的東西、遇到的問題及解決方法給總結記錄下來,以便快速提升自己,所以從那時候起就開始寫 txt 文字,做一些簡單記錄

    java併發機制的底層實現原理(一):volatile深入分析

         java程式碼最終會被類載入器載入到JVM中,然後轉化為彙編指令在CPU上執行。java中所使用的併發機制依賴於JVM的實現和CPU的指令。 1.volatile的應用 volatile是一個輕量級的synchronize,它保證了共享變數的可見性,確保了所有執

    Java底層之HashMap底層實現原理

    HashMap簡介       HashMap 是一個散列表,它儲存的內容是鍵值對(key-value)對映。 HashMap 繼承於AbstractMap,實現了Map、Cloneable、java.io.Serializable介面。 HashMap 的實現不是同步的,

    JAVA】HashMap底層實現原理淺談

                                      HashMap底層實現原理淺談 不論是實習還是正式工作,HashMap的底層實現原理一直是問地頻率最高的一個內容,今天記錄一下自己對HashMap的理解,如有不當之處,還請各位大佬指正。 一、前置名詞解釋

    Java併發程式設計的藝術》筆記二——Java併發機制的底層實現原理.md

    0.Java程式碼執行過程 Java程式碼在編譯之後會變成Java位元組碼,Java位元組碼被類載入器載入到JVM中,JVM執行位元組碼,最終轉化為彙編指令在CPU上執行,Java中所使用的併發機制依賴與JVM的實現和CPU的執行。 b本節探討下Java併發機制的實現原理。 1.

    javaArrayList底層實現

    /*** * list集合的底層使用陣列實現的 * 陣列的特點是 讀取快,因為記憶體是連續的 插入刪除慢 * * 連結串列的特點相反 : 讀取慢,因為需要記憶體不是連續的,需要找到頭節點,順序遍歷。但是插入刪除會很快 */ package com.bjsxt

    java引數傳遞底層實現原理解析

    1.如下程式碼最終輸出為:??? 這裡就要說到java 傳遞引數的兩種方式:值傳遞與引用傳遞. 1.值傳遞:方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際參 數的值。 2.引用傳遞:也稱為傳地址。方法呼叫時,實際引數的引用(地

    Java鎖--Lock實現原理(底層實現)

    關於java lock的底層實現原理,講的有點深,轉載學習! Lock完全用Java寫成,在java這個層面是無關JVM實現的。 在java.util.concurrent.locks包中有很多Lock的實現類,常用的有ReentrantLock、ReadWr

    演算法---hash演算法原理(java中HashMap底層實現原理和原始碼解析)

    散列表(Hash table,也叫雜湊表),是依據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。  比如我們要儲存八十八個資料,我們為他申請了100個

    Java中HashMap底層實現原理(JDK1.8)原始碼分析

    在JDK1.6,JDK1.7中,HashMap採用位桶+連結串列實現,即使用連結串列處理衝突,同一hash值的連結串列都儲存在一個連結串列裡。但是當位於一個桶中的元素較多,即hash值相等的元素較多時,通過key值依次查詢的效率較低。而JDK1.8中,HashMap採用位桶+