首頁技術文章正文

ArrayList集合特點為什么是增刪慢、查詢快?

更新時間:2022-11-16 來源:黑馬程序員 瀏覽量:

  一、前言:

   我們都知道ArrayList集合底層是數(shù)組結構,因為數(shù)組中每個元素是有索引存在,所以查詢效率高,增刪效率低。那為什么數(shù)組結構有索引查詢效率就會高呢?而且ArrayList集合長度是可變的,數(shù)組一旦創(chuàng)建長度就不可變,那ArrayList集合底層是數(shù)組結構,它的底層原理又是如何執(zhí)行的?

   下面我們就帶著這兩個問題,通過分析ArrayList源碼,了解其中的原理。

  二、ArrayList集合增刪慢:

  1、我們先來看一下ArrayList的底層源碼

1668568604935_1.jpg

  2、自動擴容原理

   (1)ArrayList集合底層是數(shù)組結構,新增元素時先創(chuàng)建長度為0的Object數(shù)組。

   (2)添加元素時,判斷如果原數(shù)組中沒有元素,則再創(chuàng)建長度為10的新數(shù)組。

   (3)添加元素時,判斷如果原數(shù)組中元素存滿時,則再創(chuàng)建長度為原數(shù)組長度*1.5倍的新數(shù)組。即oldCapacity + (oldCapacity >> 1);最后再將老數(shù)組元素拷貝到新數(shù)組中。

  3、結論

   ArrayList在添加元素時有可能會導致集合自動擴容,ArrayList底層是數(shù)組結構,但數(shù)組長度是不可變的不支持動態(tài)擴容,此時ArrayList集合底層會創(chuàng)建出一個新的數(shù)組,長度為老數(shù)組的1.5倍,并將老數(shù)組的元素復制到新數(shù)組中。

   ArrayList在刪除元素時底層是將刪除索引位置起到最后索引位置結束中所有的元素,一一向前復制一個索引位置,再將最后索引位置元素設置為null。

   所以ArrayList在進行增刪操作時,效率會很慢。

  三、ArrayList集合查詢快:

  1、我們先來看一下ArrayList的底層源碼

1668568654112_2.jpg

  2、結論

   ArrayList在查詢元素時底層是通過訪問數(shù)組元素方式進行查詢。

   而數(shù)組只能存儲同一類型的元素。并且聲明一個數(shù)組時,會在內存中申請一塊連續(xù)相鄰的內存空間。當要通過索引訪問數(shù)組元素時,可通過數(shù)組地址值和偏移量,直接計算出要查找元素的內存地址,所以數(shù)組支持通過索引直接訪問元素,效率非常高。

   舉例分析:

1668568681091_3.jpg

  四、總結:

   通過上述分析,我們發(fā)現(xiàn)ArrayList集合底層是Object[]數(shù)組,所以ArrayList具有數(shù)組的查詢速度快的優(yōu)點以及增刪速度慢的缺點。

分享到:
在線咨詢 我要報名
和我們在線交談!