ArrayList集合實現RandomAccess接口有何做用?爲什麼LinkedList集合卻沒實現這接口?

衆所周知,在List集合中,咱們常常會用到ArrayList以及LinkedList集合,可是經過查看源碼,就會發現ArrayList實現RandomAccess接口,可是RandomAccess接口裏面是空的!Linked並無實現RandomAccess接口。dom

這是爲何呢?性能

-----------------------------------------------------------------------------------------------------測試

這是ArrayList實現RandomAccess接口的源碼3d

------------------------------------------------------------------------------------------------------對象

這是LinkedList的源碼,並沒實現RandomAccess接口blog

------------------------------------------------------------------------------------------------------接口

這是RandomAccess接口的源碼源碼

原來RandomAccess接口是一個標誌接口(Marker),然而實現這個接口有什麼做用呢?it

解答:只要List集合實現這個接口,就能支持快速隨機訪問,然而又有人問,快速隨機訪問是什麼東西?有什麼做用?io

經過查看Collections類中的binarySearch()方法,源碼以下:

由此能夠看出,判斷list是否實現RandomAccess接口來實行indexedBinarySerach(list,key)或iteratorBinarySerach(list,key)方法。ps(instanceof其做用是用來判斷某對象是否爲某個類或接口類型)

 

那麼,又有人疑問,執行這兩個方法有什麼不一樣?

查看下indexedBinarySerach(list,key)方法源碼:

-------------------------------------------------------------------------------------------------------------

 

查看下iteratorBinarySerach(list,key)方法源碼:

經過查看源代碼,發現實現RandomAccess接口的List集合採用通常的for循環遍歷,而未實現這接口則採用迭代器。

接下來,咱們將進行下測試ArrayList以及LinkedList採用這兩種方法各自的性能是如何!

 

-------------------------------------------------------------------------------------------------------------

main方法:

-------------------------------------------------------------------------------------------------------------

 

for循環遍歷ArrayList

 

-------------------------------------------------------------------------------------------------------------

iterator迭代器遍歷ArrayList

-------------------------------------------------------------------------------------------------------------

for循環遍歷LinkedList

-------------------------------------------------------------------------------------------------------------

iterator迭代器遍歷LinkedList


-------------------------------------------------------------------------------------------------------------

運行結果:

從上面數據能夠看出,ArrayList用for循環遍歷比iterator迭代器遍歷快,LinkedList用iterator迭代器遍歷比for循環遍歷快,

因此說,當咱們在作項目時,應該考慮到List集合的不一樣子類採用不一樣的遍歷方式,可以提升性能!

然而有人發出疑問了,那怎麼判斷出接收的List子類是ArrayList仍是LinkedList呢?

這時就須要用instanceof來判斷List集合子類是否實現RandomAccess接口!

代碼以下:

-----------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------

main方法:

-----------------------------------------------------------------------------------------------------------------

運行結果:

 

總結:RandomAccess接口這個空架子的存在,是爲了可以更好地判斷集合是否ArrayList或者LinkedList,從而可以更好選擇更優的遍歷方式,提升性能!

相關文章
相關標籤/搜索