作者:蔡先森_caiyq
https://www.jianshu.com/p/3e2a9e4c9e01

在我們的開發中,List介面是最常見不過,而且我們幾乎每天都在用ArrayList或者LinkedList,但是細心的同學有沒有發現,ArrayList中實作了RandomAccess介面,而LinkedList卻沒有實作
RandomAccess介面,這是為什么呢?

RandomAccess介面中是空的,RandomAccess介面又是什么呢?

RandomAccess介面
RandomAccess是一個標記介面,官方解釋是只要List實作這個介面,就能支持快速隨機訪問,而什么是隨機訪問呢?
接下來我們來舉例說明,
Collections是集合的一個工具類,我們看一下Collections原始碼中的二分搜索方法,

在原始碼中可以看出,判斷list是否是RandomAccess的實體,如果是,則執行indexedBinarySearch方法,如果不是,則執行iteratorBinarySearch方法,接下來看一下這兩個方法,


上述兩個方法的原始碼表示,實作了RandomAccess介面的List使用索引遍歷,而未實作RandomAccess介面的List使用迭代器遍歷,
那么為什么要這么設計呢?
既然涉及到二分搜索的遍歷操作,那么現在我們來分析一下ArrayList和LinkedList遍歷元素的性能如何?




測驗結果如下測驗ArrayList通過for遍歷所消耗時間:1
測驗ArrayList通過iterator遍歷所消耗時間:2
測驗LinkedList通過for遍歷所消耗時間:47
測驗LinkedList通過iterator遍歷所消耗時間:1
我們來分析一下測驗結果:ArrayList通過for遍歷比通過iterator遍歷要稍快,LinkedList通過iterator遍歷比通過for遍歷要快,
所以說在我們的應用中,要考慮使用List介面的哪種實作類,可以更好更高效的滿足實際場景需求,所以在這里通過實作RandomAccess介面來區分List的哪種實作類,
總結
最后總結一句話:實作RandomAccess介面的List可以通過for回圈來遍歷資料比使用iterator遍歷資料更高效,未實作RandomAccess介面的List可以通過iterator遍歷資料比使用for回圈來遍歷資料更高效,
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/186828.html
標籤:Java
