jdk順序表筆記,jdk順序筆記
一、AbstractCollection
提供了集合的最大實現
繼承該類,必須實現size()和iterator(),因為該類操作集合都是通過iterator
二、fail-fast策略
該策略在集合框架中多次被應用
一種多線程對同一集合操作的保護措施,確保操作目標沒有被其他線程操作過,與cas思想有異曲同工之處
具體在集合中的實現:
定義一個全局變量modCount,表示集合被修改的次數
每次進行動態操作的時候,modCount++
在Iterator中定義一個全局變量expectedModCount,
每次操作Iterator的時候都會比較modCount和expectedModCount,相等則認為這個集合沒有被並發修改,否則會拋出ConcurrentModificationException
所以只要有modCount這個變量的,都是線程不安全的,這種集合最好使用迭代器,因為直接操作不會檢查集合有沒有被並發修改
使用volatile修飾modCount
被volatile修飾的變量,程序中的每次引用,處理器都會從內存(共享內存)中去讀值,而不是從寄存器(線程獨有內存)中獲取
這使得fail-fast策略更可靠
三、AbstractList
提供了順序表的最大實現
該類實現了迭代器
繼承該類,需要實現get方法,因為迭代器的next是調用了get
四、ArrayList
1.初始容量為10
構造器(集合)和addAll,是深拷貝,因為調的是AbstractCollection.toArray()---->Arrays.copyOf()------>System.arraycopy()
2.多用會用trimToSize
因為順序表一建立的時候,就會創建一個初始大小的數組,這樣就會有空余的位置,調用這個方法可以把多余的位置清理,節約空間
實際長度是存儲數組的length,不是全局變量size,size意味著有多個個元素是有數據的
3.擴展容量
默認是增大一半的空間,要考慮int溢出(溢出<0),以及虛擬機的最大內存
必用ensureCapacity(int minSize),需要增大容量的時候,都要調用
都要確認這個容量是否支持,不支持則會擴展容量
防止數組越界
4.toArray,clone都是深度拷貝
5.維護的數組是沒有泛型的,當需要獲取元素的時候,才去轉型
6.對於動態操作
並沒有像通常數據結構的書那樣子,要移動操作元素後續的節點,而是直接拷貝一份
7.養成好習慣
動態操作了之後,不單單只是移動指針,要將不存在的元素位置設置為null,目的是為了讓垃圾收集器工作
8.提供一些安全性低,但是快速的private方法
比如remove(Obj),獲取下標了之後,就可以調用一個fastRemove(index),不需要二次比較值
9.subList(from,to)
返回的是該集合的視圖,視圖是淺拷貝,會直接操作該集合
查看原文:http://blog.zswlib.com/2016/10/26/jdk%e9%a1%ba%e5%ba%8f%e8%a1%a8%e7%ac%94%e8%ae%b0/