ArrayList小結及對擴容的理解

2021-09-29 14:25:48 字數 883 閱讀 4609

特點: 查詢快,增刪慢,執行緒不安全(陣列為基礎的資料結構)

執行緒不安全的體現舉例: a執行緒向arraylist索引為0的位置插入乙個資料的時候,執行完插入操作還未將size加一的時候進入等待,然後b執行緒也向索引為0的位置插入資料,然後size加一,執行完後a執行緒繼續進行,當a執行緒執行完以後索引為0的位置只有乙個資料,但是size卻是加二,說明在多執行緒操作的環境中是執行緒不安全的

擴容原理: arraylist的初始容量的大小是10,當新增第11個元素的時候就會對當前集合進行擴容,新的容量的大小是舊的1.5倍. 擴容的方法是grow()方法, 在擴容的時候會建立乙個新的陣列,然後修改原陣列,使陣列中的元素指向新的陣列,原陣列被拋棄之後會被gc**. 擴容時會對新陣列的容量大小進行乙個比較,如果1.5倍的容量大小任然小於元素個數(新增元素的最小容量),那麼會將新增元素的最小容量作為新陣列的容量,此時還需要進行判斷,如果此時容量的大小大於最大容量,那麼會呼叫hugecapacity方法,如果mincapacity大於max_array_size,則返回integer的最大值. 否則返回max_array_size.

注意: private static final int max_array_size = integer.max_value - 8;
之後繼續回到grow()方法中呼叫arrays.copyof()方法,即將原來陣列的內容複製到新容量的大陣列中.

ArrayList 擴容原理

面試中經常問到的問題之一就是list的擴容機制了,他是怎麼做到擴容的,大家都能答出來底層是陣列,複製乙個陣列來擴容,但是再具體一點來說,大家就不知道該怎麼說了,如果不看原始碼說這麼多確實就差不多了,但是看了原始碼你會說的更多,更詳細,更具體,本篇主要看的是jdk1.8 至於其他版本大同小異,看看就知...

ArrayList擴容機制

1.成員變數 預設給定的初始容量 private static final int default capacity 10 無參構造器中所使用到的空陣列例項 private static final object empty elementdata 有參構造器中所使用到的空陣列例項 private ...

ArrayList 擴容原理

面試中經常問到的問題之一就是list的擴容機制了,他是怎麼做到擴容的,大家都能答出來底層是陣列,複製乙個陣列來擴容,但是再具體一點來說,大家就不知道該怎麼說了,如果不看原始碼說這麼多確實就差不多了,但是看了原始碼你會說的更多,更詳細,更具體,本篇主要看的是jdk1.8 至於其他版本大同小異,看看就知...