衆所周知,在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,從而可以更好選擇更優的遍歷方式,提升性能!