1. 程式人生 > >ArrayList集合實現RandomAccess介面有何作用?為何LinkedList集合卻沒實現這介面?

ArrayList集合實現RandomAccess介面有何作用?為何LinkedList集合卻沒實現這介面?

眾所周知,在List集合中,我們經常會用到ArrayList以及LinkedList集合,但是通過檢視原始碼,就會發現ArrayList實現RandomAccess介面,但是RandomAccess接口裡面是空的!Linked並沒有實現RandomAccess介面。

這是為什麼呢?

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

這是ArrayList實現RandomAccess介面的原始碼

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

這是LinkedList的原始碼,並沒實現RandomAccess介面


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

這是RandomAccess介面的原始碼

原來RandomAccess介面是一個標誌介面(Marker),然而實現這個介面有什麼作用呢?

解答:只要List集合實現這個介面,就能支援快速隨機訪問,然而又有人問,快速隨機訪問是什麼東西?有什麼作用?

通過檢視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,從而能夠更好選擇更優的遍歷方式,提高效能!

真心佳作,實屬不易!碼農道路,多多指教!