java-List集合的源码分析(数据结构方面,源码注释方面),迭代器快速失败机制
List實現了Collection接口,產生三個子類:ArrayList,LinkedList,Vector
文章包含解釋方面:
數據結構方面,
源碼注釋方面&迭代器快速失敗機制
方面1—基于源碼的數據結構
基于源碼的數據結構,我們先給出如下比較結果:
ArrayList&Vector是基于數組的實現。
那么他們:
注解:
我們看一下ArrayList的擴容源碼(Vector省略(擴容一倍)):
判斷是否擴容代碼,在發生在每次添加數據時(每次使用size+數據長度和當前容量比較),但是源碼里面規定了當數組容量小于10(DEFAULT_CAPACITY )時不會進行擴容
ArrayList:
我們發現擴容很簡單,但是也是耗費系統資源的,協調用法比較重要
int newCapacity = oldCapacity + (oldCapacity >> 1); elementData = Arrays.copyOf(elementData, newCapacity);這兩句說,
當發生擴容時先對原有的數組長度進行右移一位,也就是擴容一半(減少擴容次數,增大用量 )
LinkedList基于雙向鏈表的實現。
那么:
我們看出前者適合多查詢,少插入的數據,后者適合多插入,少查詢的數據
不過一般大家都是綜合考慮。
方面2—基于各個源碼的類的主要注釋
基于各個源碼的類的注釋
給出LinkedList:
閱讀發現,LinkedList是線程不安全的,它的迭代器是快速失敗的
他允節點為null值,遍歷都是從頭或尾開始的
ArrayList:
閱讀發現,ArrayList是線程不安全的,它的迭代器是快速失敗的
它是大小可變的,復雜度為O(n)
Vector:
閱讀發現,Vector是線程安全的(那消耗資源也會多),迭代器也是快速失敗的。
**對于ArrayList,LinkedList的線程不安全,可在創建時利用Collections.synchronizedList進行"包裝"
即:
關于迭代器的快速失敗(異常訪問操作,必須拋異常)
在此時,我們三個類一起看,發現他們的類,迭代器都是快速失敗的,
什么是快速失敗?
這是一種集合的錯誤處理機制(Map,Set也有),他會盡全力拋出ConcurrentModificationException異常(因為判斷拋出的標準是值是否相等,而開發者并不保證值被人為修改),在你通過自身迭代器遍歷時,對集合內容修改的時候,就會直接拋異常,退出迭代
其實原因很簡單,源碼里面有個modCount變量,他會在集合迭代時,每次增刪時加一(其他非迭代修改沒問題),迭代器會通過這個變量是否改變( modCount!=expectedmodCount)進行決定拋異常(在每次迭代下一個元素時next()會觸發)
這是一種判斷方式,這樣會保護集合的正確性,也既是保證集合不能并發訪問。
如果還是不對,可以百度:
java中的fail-fast(快速失敗)機制這樣再一看List發現再也不是只知形不知意了。
ps:源碼學習目前只能靠邊看代碼邊寫博客進行總結,沒什么更多的有效方法,朋友們可以的話,留下你寶貴的學習 建議|方法,我一定虛心接受。
總結
以上是生活随笔為你收集整理的java-List集合的源码分析(数据结构方面,源码注释方面),迭代器快速失败机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 探究java-JVM的五步(三步)类加载
- 下一篇: java-HashMap源码学习