Java ArrayList底層實現原理
- 概述
- 會自動擴容的陣列,執行緒安全
- 基本與ArrayList一致,只要記住多了執行緒安全,效率低低一點
- 查詢快,增刪慢
- 底層實現、
- Object陣列實現,
- 預設陣列長度為10,預設的擴容長度是原陣列2倍,也可通過構造器自定義擴容長度
- 也有modcount值
- 每次對陣列結構進行改變時,該值都會增加1
- 在迭代器中會有expectedModCount值,會與此值進行比較,如果一致迭代;不一致,丟擲異常。
- 簡單校驗,防止迭代期間原始集合改變
- 方法
- capacity():底層陣列長度,不是陣列內元素的個數
- size():元素的個數
ArrayList是List介面的可變陣列的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 List 介面外,此類還提供一些方法來操作內部用來儲存列表的陣列的大小。
每個ArrayList例項都有一個容量,該容量是指用來儲存列表元素的陣列的大小。它總是至少等於列表的大小。隨著向ArrayList中不斷新增元素,其容量也自動增長。自動增長會帶來資料向新陣列的重新拷貝,因此,如果可預知資料量的多少,可在構造ArrayList時指定其容量。在新增大量元素前,應用程式也可以使用ensureCapacity操作來增加ArrayList例項的容量,這可以減少遞增式再分配的數量。
注意,此實現不是同步的。如果多個執行緒同時訪問一個ArrayList例項,而其中至少一個執行緒從結構上修改了列表,那麼它必須保持外部同步。
2. ArrayList的實現:
對於ArrayList而言,它實現List介面、底層使用陣列儲存所有元素。其操作基本上是對陣列的操作。下面我們來分析ArrayList的原始碼:
1) 底層使用陣列實現:
- privatetransient Object[] elementData;
ArrayList提供了三種方式的構造器,可以構造一個預設初始容量為10的空列表、構造一個指定初始容量的空列表以及構造一個包含指定collection的元素的列表,這些元素按照該collection的迭代器返回它們的順序排列的。
- public ArrayList() {
- this
- }
- public ArrayList(int initialCapacity) {
- super();
- if (initialCapacity < 0)
- thrownew IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
- this.elementData = new Object[initialCapacity];
- }
- public ArrayList(Collection<? extends E> c) {
- elementData = c.toArray();
- size = elementData.length;
- // c.toArray might (incorrectly) not return Object[] (see 6260652)
- if (elementData.getClass() != Object[].class)
- elementData = Arrays.copyOf(elementData, size, Object[].class);
- }
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)這些新增元素的方法。下面我們一一講解:
- // 用指定的元素替代此列表中指定位置上的元素,並返回以前位於該位置上的元素。
- 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.
java【ArrayList底層實現】
/*** * 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採用位桶+