更新時間:2022-11-16 來源:黑馬程序員 瀏覽量:
一、前言:
我們都知道ArrayList集合底層是數組結構,因為數組中每個元素是有索引存在,所以查詢效率高,增刪效率低。那為什么數組結構有索引查詢效率就會高呢?而且ArrayList集合長度是可變的,數組一旦創(chuàng)建長度就不可變,那ArrayList集合底層是數組結構,它的底層原理又是如何執(zhí)行的?
下面我們就帶著這兩個問題,通過分析ArrayList源碼,了解其中的原理。
二、ArrayList集合增刪慢:
1、我們先來看一下ArrayList的底層源碼
2、自動擴容原理
(1)ArrayList集合底層是數組結構,新增元素時先創(chuàng)建長度為0的Object數組。
(2)添加元素時,判斷如果原數組中沒有元素,則再創(chuàng)建長度為10的新數組。
(3)添加元素時,判斷如果原數組中元素存滿時,則再創(chuàng)建長度為原數組長度*1.5倍的新數組。即oldCapacity + (oldCapacity >> 1);最后再將老數組元素拷貝到新數組中。
3、結論
ArrayList在添加元素時有可能會導致集合自動擴容,ArrayList底層是數組結構,但數組長度是不可變的不支持動態(tài)擴容,此時ArrayList集合底層會創(chuàng)建出一個新的數組,長度為老數組的1.5倍,并將老數組的元素復制到新數組中。
ArrayList在刪除元素時底層是將刪除索引位置起到最后索引位置結束中所有的元素,一一向前復制一個索引位置,再將最后索引位置元素設置為null。
所以ArrayList在進行增刪操作時,效率會很慢。
三、ArrayList集合查詢快:
1、我們先來看一下ArrayList的底層源碼
2、結論
ArrayList在查詢元素時底層是通過訪問數組元素方式進行查詢。
而數組只能存儲同一類型的元素。并且聲明一個數組時,會在內存中申請一塊連續(xù)相鄰的內存空間。當要通過索引訪問數組元素時,可通過數組地址值和偏移量,直接計算出要查找元素的內存地址,所以數組支持通過索引直接訪問元素,效率非常高。
舉例分析:
四、總結:
通過上述分析,我們發(fā)現ArrayList集合底層是Object[]數組,所以ArrayList具有數組的查詢速度快的優(yōu)點以及增刪速度慢的缺點。