ArrayList源碼

  1. package java.util;
  2. import java.util.function.Consumer;
  3. import java.util.function.Predicate;
  4. import java.util.function.UnaryOperator;
  5. /**
  6. * 能夠改變大小的List的實現,實現全部的List的操做,容許保存各類元素,包括null。除了實現
  7. * List接口以外,這個類提供了操做內部存儲數據的數組大小的方法。(這個類至關於Vector,
  8. * 可是它並非線程同步的,不是線程安全的)
  9. *
  10. * size,isEmpty,set,iterator,listIterator方法運行時間爲常量時間,add方法運行爲攤還常量
  11. * 時間,也即增長n個元素的時間爲O(n)。其餘的操做運行時間大體爲線性時間,常數因子相較
  12. * 於LinkedList更小
  13. *
  14. * 每一個ArrayList實例都有一個容量,是存儲數據的數組的大小,他至少是List的元素數量的大小。
  15. * 隨着元素的增長,容量自動增長。容量增大的細節在添加一個元素有恆定的時間成本攤銷的基礎上
  16. *
  17. * 在添加大量元素前,應用程序可使用ensureCapacity方法增大Arraylist的容量, 這可能減小
  18. * 增量從新分配的次數
  19. *
  20. * 這個實現是非線程安全的,若是有多個線程同時操做一個ArrayList實例,其中至少有一個線程
  21. * 在修改這個實例的結構,則必須在外部使用同步控制(一個結構上的修改操做指的是添加或刪除一個
  22. * 或多個元素,或者明確改變存儲數據的數組大小,僅僅改變元素值不是結構上的修改),這通常由
  23. * 封裝ArrayList的類來進行。
  24. *
  25. * 若是沒有這樣的對象存在,列表應該使用Collections.synchronizedList方法來得到同步的
  26. * (線程安全的)裝飾對象(代理對象)。這個操做最好在建立的時候進行,來防止意外的非同步的
  27. * 操做。還可使用concurrent包下的CopyOnWriteArrayList代替ArrayList的使用
  28. *
  29. *
  30. * 使用類的iterator()和listIterator(int)方法會出發fail-fast錯誤機制(拋出
  31. * ConcurrentModificationException異常),若是建立了iterator後進行結構上的修改,除了使
  32. * 用iterator的remove或者add方法。所以,在併發修改時,iterator快速失敗而且清除,而不是冒
  33. * 着未來可能發生的不肯定的風險。
  34. *
  35. * 迭代器的fail-fast錯誤機制不能被保證,一般來講,很難保證在非同步併發修改操做的fail-fast
  36. * 機制。fail-fast錯誤機制的迭代器力所能及的拋出ConcurrentModificationException。
  37. * 因此,開發時不該該依賴這個異常保證程序的正確性,僅僅在發現bug時使用
  38. * 繼承了AbstractList,能夠繼承部分默認的實現
  39. * 實現了Cloneable, java.io.Serializable,容許克隆和序列化
  40. */
  41. publicclassArrayList<E>extendsAbstractList<E>
  42. implementsList<E>,RandomAccess,Cloneable, java.io.Serializable
  43. {
  44. //序列號
  45. privatestaticfinallong serialVersionUID =8683452581122892189L;
  46. /**
  47. * 列表默認容量
  48. */
  49. privatestaticfinalint DEFAULT_CAPACITY =10;
  50. /**
  51. * 共享空數組實例,用於空實例。調用構造函數容量爲0時,會賦予數據的數組
  52. */
  53. privatestaticfinalObject[] EMPTY_ELEMENTDATA ={};
  54. /**
  55. * 共享空數組實例用於默認大小的空實例。使用默認構造函數時,會賦予數據的數組
  56. */
  57. privatestaticfinalObject[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA ={};
  58. /**
  59. * 存儲數據的數組,數組大小就是列表的容量的大小。在第一次加入元素時,任何空實例
  60. * (DEFAULTCAPACITY_EMPTY_ELEMENTDATA)會擴充成默認大小。
  61. * transient表示序列化過程不但願被序列化的字段,ArrayList本身實現的序列化機制會
  62. * 逐個序列化每一個元素
  63. */
  64. transientObject[] elementData;// non-private to simplify nested class access
  65. /**
  66. * 列表中元素的數量
  67. *
  68. * @serial
  69. */
  70. privateint size;
  71. /**
  72. * 構造一個指定容量的空列表
  73. *
  74. * @param initialCapacity 列表的初始容量
  75. * @throws IllegalArgumentException 傳入的初始容量爲負數時,拋出次異常
  76. */
  77. publicArrayList(int initialCapacity){
  78. if(initialCapacity >0){
  79. this.elementData =newObject[initialCapacity];
  80. }elseif(initialCapacity ==0){
  81. this.elementData = EMPTY_ELEMENTDATA;
  82. }else{
  83. thrownewIllegalArgumentException("Illegal Capacity: "+
  84. initialCapacity);
  85. }
  86. }
  87. /**
  88. * 構造一個默認大小的空列表
  89. */
  90. publicArrayList(){
  91. this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  92. }
  93. /**
  94. * 根據傳入的集合,構造一個列表,元素的順序是傳入集合的迭代器返回的順序
  95. *
  96. * @param c 傳入的容器
  97. * @throws NullPointerException 傳入的容器爲空時拋出異常
  98. */
  99. publicArrayList(Collection<?extends E> c){
  100. elementData = c.toArray();
  101. if((size = elementData.length)!=0){
  102. // c.toArray()可能沒有返回 Object[]
  103. if(elementData.getClass()!=Object[].class)
  104. //轉成Object類型
  105. elementData =Arrays.copyOf(elementData, size,Object[].class);
  106. }else{
  107. // 若是傳入的集合沒有元素,則使用空數組代替
  108. this.elementData = EMPTY_ELEMENTDATA;
  109. }
  110. }
  111. /**
  112. * 減少列表的容器大小至列表中元素數量
  113. */
  114. publicvoid trimToSize(){
  115. modCount++;
  116. if(size < elementData.length){
  117. elementData =(size ==0)
  118. ? EMPTY_ELEMENTDATA
  119. :Arrays.copyOf(elementData, size);
  120. }
  121. }
  122. /**
  123. * 增大ArrayList實例的容量, 若是必要,保證可以存儲傳入的最小容量個元素
  124. *
  125. * @param minCapacity 須要的最少的存儲容量
  126. */
  127. publicvoid ensureCapacity(int minCapacity){
  128. int minExpand =(elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
  129. // any size if not default element table
  130. ?0
  131. // larger than default for default empty table. It's already
  132. // supposed to be at default size.
  133. : DEFAULT_CAPACITY;
  134. if(minCapacity > minExpand){
  135. ensureExplicitCapacity(minCapacity);
  136. }
  137. }
  138. privatevoid ensureCapacityInternal(int minCapacity){
  139. //默認大小數組,將數組擴展成默認或者minCapacity的大的容量
  140. if(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
  141. minCapacity =Math.max(DEFAULT_CAPACITY, minCapacity);
  142. }
  143. ensureExplicitCapacity(minCapacity);
  144. }
  145. //確保數組可以保存足夠的元素
  146. privatevoid ensureExplicitCapacity(int minCapacity){
  147. modCount++;
  148. // 當要求的數量大於數組的大小,擴充成須要的數量
  149. if(minCapacity - elementData.length >0)
  150. grow(minCapacity);
  151. }
  152. /**
  153. * 最大容許的容量
  154. * 一些虛擬機會存儲一些頭信息
  155. * 嘗試分配大容量的數組會致使OutOfMemoryError,超出虛擬機的限制
  156. */
  157. privatestaticfinalint MAX_ARRAY_SIZE =Integer.MAX_VALUE -8;
  158. /**
  159. * 擴充容量以保證可以存儲須要的容量(傳入的參數)
  160. *
  161. * @param minCapacity 須要的容量大小
  162. */
  163. privatevoid grow(int minCapacity){
  164. // overflow-conscious code
  165. int oldCapacity = elementData.length;
  166. //擴充原來容量的1/2,即擴大1.5倍
  167. int newCapacity = oldCapacity +(oldCapacity >>1);
  168. //若是須要的容量仍是不夠,則擴充至須要的容量的大小
  169. if(newCapacity - minCapacity <0)
  170. newCapacity = minCapacity;
  171. /**
  172. * 若是超出定義的最大容量,擴充至定義的最大容量(須要的容量小於等於定義的最大
  173. * 容量)或最大int的值(須要的容量大小大於定義的最大容量)
  174. * */
  175. if(newCapacity - MAX_ARRAY_SIZE >0)
  176. newCapacity = hugeCapacity(minCapacity);
  177. // minCapacity is usually close to size, so this is a win:
  178. elementData =Arrays.copyOf(elementData, newCapacity);
  179. }
  180. // 根據須要的容量大小,得到超大容量
  181. privatestaticint hugeCapacity(int minCapacity){
  182. if(minCapacity <0)// 若是minCapacity小於0,則超出最大整數值
  183. thrownewOutOfMemoryError();
  184. return(minCapacity > MAX_ARRAY_SIZE)?
  185. Integer.MAX_VALUE :
  186. MAX_ARRAY_SIZE;
  187. }
  188. /**
  189. * 返回列表的中元素的數量
  190. *
  191. * @return 列表的中元素的數量
  192. */
  193. publicint size(){
  194. return size;
  195. }
  196. /**
  197. * 判斷列表是否爲空
  198. *
  199. * @return 當列表中沒有元素則返回true,不然返回false
  200. */
  201. publicboolean isEmpty(){
  202. return size ==0;
  203. }
  204. /**
  205. * 當列表中存在傳入的元素,返回true。進一步,列表中至少有一個傳入的元素,則返回true
  206. * 好比 o爲null,則判斷列表中是否有null元素,返回o與列表中的元素e的equals()比較的結果
  207. *
  208. * @param 須要檢驗是否在列表中的元素的對象
  209. * @return 若是列表中存在o則返回true
  210. */
  211. publicboolean contains(Object o){
  212. return indexOf(o)>=0;
  213. }
  214. /**
  215. * 返回列表中第一次出現的o(equals方法返回true)的索引,若是不存在則返回-1
  216. */
  217. publicint indexOf(Object o){
  218. if(o ==null){
  219. for(int i =0; i < size; i++)
  220. if(elementData[i]==null)
  221. return i;
  222. }else{
  223. for(int i =0; i < size; i++)
  224. if(o.equals(elementData[i]))
  225. return i;
  226. }
  227. return-1;
  228. }
  229. /**
  230. * 返回列表中最後一次出現的o(equals方法返回true)的索引,若是不存在則返回-1
  231. */
  232. publicint lastIndexOf(Object o){
  233. if(o ==null){
  234. for(int i = size-1; i >=0; i--)
  235. if(elementData[i]==null)
  236. return i;
  237. }else{
  238. for(int i = size-1; i >=0; i--)
  239. if(o.equals(elementData[i]))
  240. return i;
  241. }
  242. return-1;
  243. }
  244. /**
  245. * 返回ArrayList實例的淺表複製,不復制列表的元素(都指向相同的對象,沒有建立新的對
  246. * 象)。
  247. */
  248. publicObject clone(){
  249. try{
  250. ArrayList<?> v =(ArrayList<?>)super.clone();
  251. v.elementData =Arrays.copyOf(elementData, size);
  252. v.modCount =0;
  253. return v;
  254. }catch(CloneNotSupportedException e){
  255. // this shouldn't happen, since we are Cloneable
  256. thrownewInternalError(e);
  257. }
  258. }
  259. /**
  260. * 得到按照列表順序存儲的數組,這個方法須要分配內存存儲拷貝的數組。(淺複製)
  261. *
  262. * @return an array containing all of the elements in this list in
  263. * proper sequence
  264. */
  265. publicObject[] toArray(){
  266. returnArrays.copyOf(elementData, size);
  267. }
  268. /**
  269. * 得到按照列表順序存儲的數組,返回一個泛型數組,這個方法須要分配內存存儲拷貝的數組
  270. * (淺複製),返回的數組的類型應該是參數指定的類型。若是傳入的數組大小大於列表的元素
  271. * 則返回,傳入的數組,不然建立一個新的數組,並返回新建立的數組
  272. *
  273. * 若是傳入的數組長度大於列表的長度,則設置其第size個元素爲null(當且僅當在知道list中
  274. * 沒有null元素時,用於判斷list中元素個數)
  275. * @param a 若是足夠大,存儲列表中的元素,不然根據傳入的運行時參數建立一個新的數組
  276. * @return 返回列表元素的一個拷貝
  277. * @throws ArrayStoreException if the runtime type of the specified array
  278. * is not a supertype of the runtime type of every element in
  279. * this list
  280. * @throws NullPointerException if the specified array is null
  281. */
  282. @SuppressWarnings("unchecked")
  283. public<T> T[] toArray(T[] a){
  284. if(a.length < size)
  285. // Make a new array of a's runtime type, but my contents:
  286. return(T[])Arrays.copyOf(elementData, size, a.getClass());
  287. System.arraycopy(elementData,0, a,0, size);
  288. if(a.length > size)
  289. a[size]=null;
  290. return a;
  291. }
  292. /**
  293. * 根據索引,得到列表中第index個元素,首先檢查下標是否在正確的範圍
  294. */
  295. @SuppressWarnings("unchecked")
  296. E elementData(int index){
  297. return(E) elementData[index];
  298. }
  299. /**
  300. * 返回第index個元素
  301. *
  302. * @param index index of the element to return
  303. * @return the element at the specified position in this list
  304. * @throws IndexOutOfBoundsException {@inheritDoc}
  305. */
  306. public E get(int index){
  307. rangeCheck(index);
  308. return elementData(index);
  309. }
  310. /**
  311. * 將第index個元素的值修改成傳入的元素值,首先檢查下標是否在正確的範圍,返回修改前的值
  312. *
  313. * @param index 元素的索引
  314. * @param element 設置到index的值
  315. * @return 原來位於index的值
  316. * @throws IndexOutOfBoundsException {@inheritDoc}
  317. */
  318. public E set(int index, E element){
  319. rangeCheck(index);
  320. E oldValue = elementData(index);
  321. elementData[index]= element;
  322. return oldValue;
  323. }
  324. /**
  325. * 在列表的末尾添加元素,修改列表的元素數量(size)。首先須要確保列表的容量足夠存放新
  326. * 添加的元素。
  327. *
  328. * @param e element to be appended to this list
  329. * @return <tt>true</tt> (as specified by {@link Collection#add})
  330. */
  331. publicboolean add(E e){
  332. ensureCapacityInternal(size +1);// 確保可以存放添加元素,容量不足則擴容
  333. elementData[size++]= e;
  334. returntrue;
  335. }
  336. /**
  337. * 在列表第index個位置插入一個元素,index及其後面的元素向後移動一個位置,而後將須要插
  338. * 入的值存入第index的位置
  339. *
  340. * @param index index at which the specified element is to be inserted
  341. * @param element element to be inserted
  342. * @throws IndexOutOfBoundsException {@inheritDoc}
  343. */
  344. publicvoid add(int index, E element){
  345. rangeCheckForAdd(index);
  346. ensureCapacityInternal(size +1);// 確保有足夠的存儲空間
  347. System.arraycopy(elementData, index, elementData, index +1,
  348. size - index);
  349. elementData[index]= element;
  350. size++;
  351. }
  352. /**
  353. * 移除列表中第index個元素,index後面的元素向前移動一個位置,列表元素數量減少1
  354. *
  355. * @param index 移除的元素的下標
  356. * @return 返回被刪除的元素
  357. * @throws IndexOutOfBoundsException {@inheritDoc}
  358. */
  359. public E remove(int index){
  360. rangeCheck(index);
  361. modCount++;//
  362. E oldValue = elementData(index);
  363. int numMoved = size - index -1;
  364. if(numMoved >0)
  365. System.arraycopy(elementData, index+1, elementData, index,
  366. numMoved);
  367. elementData[--size]=null;// 釋放,以讓垃圾回收器回收
  368. return oldValue;
  369. }
  370. /**
  371. * 移除列表中第一個o(o爲null時,第一個null元素,不然,是第一個equals()爲true的元
  372. * 素),若是過不存在,則不改變。若是列表中存在這樣的元素,則返回true,不然返回false
  373. *
  374. * @param o element to be removed from this list, if present
  375. * @return <tt>true</tt> if this list contained the specified element
  376. */
  377. publicboolean remove(Object o){
  378. if(o ==null){
  379. for(int index =0; index < size; index++)
  380. if(elementData[index]==null){
  381. fastRemove(index);
  382. returntrue;
  383. }
  384. }else{
  385. for(int index =0; index < size; index++)
  386. if(o.equals(elementData[index])){
  387. fastRemove(index);
  388. returntrue;
  389. }
  390. }
  391. returnfalse;
  392. }
  393. /*
  394. * 快速移除元素,不檢查索引範圍,不返回被刪除元素
  395. */
  396. privatevoid fastRemove(int index){
  397. modCount++;
  398. int numMoved = size - index -1;
  399. if(numMoved >0)
  400. System.arraycopy(elementData, index+1, elementData, index,
  401. numMoved);
  402. elementData[--size]=null;// 釋放,以讓垃圾回收器回收
  403. }
  404. /**
  405. * 移除列表中全部的元素,操做後,列表爲空
  406. */
  407. publicvoid clear(){
  408. modCount++;
  409. // 釋放全部引用,以讓垃圾收集器回收
  410. for(int i =0; i < size; i++)
  411. elementData[i]=null;
  412. //列表大小改成0
  413. size =0;
  414. }
  415. /**
  416. * 向列表末尾添加c中的全部元素,順序是c.iterator()返回的順序,添加了元素返回true。
  417. *
  418. * @param c collection containing elements to be added to this list
  419. * @return <tt>true</tt> if this list changed as a result of the call
  420. * @throws NullPointerException if the specified collection is null
  421. */
  422. publicboolean addAll(Collection<?extends E> c){
  423. Object[] a = c.toArray();
  424. int numNew = a.length;
  425. ensureCapacityInternal(size + numNew);// Increments modCount
  426. System.arraycopy(a,0, elementData, size, numNew);
  427. size += numNew;
  428. return numNew !=0;
  429. }
  430. /**
  431. * 向列表第index位置起添加c中的全部元素,順序是c.iterator()返回的順序,index及其後面
  432. * 的元素向後移動c中元素個位置,添加了元素返回true。首先須要檢查index是不是在範圍內
  433. *
  434. * @param index index at which to insert the first element from the
  435. * specified collection
  436. * @param c collection containing elements to be added to this list
  437. * @return <tt>true</tt> if this list changed as a result of the call
  438. * @throws IndexOutOfBoundsException {@inheritDoc}
  439. * @throws NullPointerException if the specified collection is null
  440. */
  441. publicboolean addAll(int index,Collection<?extends E> c){
  442. rangeCheckForAdd(index);
  443. Object[] a = c.toArray();
  444. int numNew = a.length;
  445. ensureCapacityInternal(size + numNew);// Increments modCount
  446. int numMoved = size - index;
  447. if(numMoved >0)
  448. System.arraycopy(elementData, index, elementData, index + numNew,
  449. numMoved);
  450. System.arraycopy(a,0, elementData, index, numNew);
  451. size += numNew;
  452. return numNew !=0;
  453. }
  454. /**
  455. * 移除元素,移除[fromIndex,toIndex)範圍的元素,不包括toIndex
  456. *
  457. * @throws IndexOutOfBoundsException if {@code fromIndex} or
  458. * {@code toIndex} is out of range
  459. * ({@code fromIndex < 0 ||
  460. * fromIndex >= size() ||
  461. * toIndex > size() ||
  462. * toIndex < fromIndex})
  463. */
  464. protectedvoid removeRange(int fromIndex,int toIndex){
  465. modCount++;
  466. int numMoved = size - toIndex;
  467. System.arraycopy(elementData, toIndex, elementData, fromIndex,
  468. numMoved);
  469. // 釋放(移動後列表最後一個元素以後的)引用,以讓垃圾收集器回收
  470. int newSize = size -(toIndex-fromIndex);
  471. for(int i = newSize; i < size; i++){
  472. elementData[i]=null;
  473. }
  474. size = newSize;
  475. }
  476. /**
  477. * 檢查索引值是否在合理的範圍內,不在則拋出異常
  478. * negative: It is always used immediately prior to an array access,
  479. * which throws an ArrayIndexOutOfBoundsException if index is negative.
  480. */
  481. privatevoid rangeCheck(int index){
  482. if(index >= size)
  483. thrownewIndexOutOfBoundsException(outOfBoundsMsg(index));
  484. }
  485. /**
  486. * 檢查索引值是否在合理的範圍內,不在則拋出異常
  487. */
  488. privatevoid rangeCheckForAdd(int index){
  489. if(index > size || index <0)
  490. thrownewIndexOutOfBoundsException(outOfBoundsMsg(index));
  491. }
  492. /**
  493. * 生成數組越界異常信息
  494. */
  495. privateString outOfBoundsMsg(int index){
  496. return"Index: "+index+", Size: "+size;
  497. }
  498. /**
  499. * 移除列表中的c中包含的全部元素
  500. *
  501. * @param c 須要移除的元素集合,不能爲空
  502. * @return 若是列表改變了,則返回true,不然返回false
  503. * @throws ClassCastException 若是傳入的集合中有與列表中元素類型不匹配時,拋出該異
  504. * 常
  505. * @throws NullPointerException ArrayList不支持null,但c中包含null元素時,拋出該
  506. * 異常
  507. */
  508. publicboolean removeAll(Collection<?> c){
  509. Objects.requireNonNull(c);
  510. return batchRemove(c,false);
  511. }
  512. /**
  513. * 保留列表中與c中共有的元素(求交集)。
  514. *
  515. * @param c 須要完成交集的集合,不容許爲空
  516. * @return 若是列表改變了,則返回true,不然返回false
  517. * @throws ClassCastException 若是傳入的集合中有與列表中元素類型不匹配時,拋出該異
  518. * 常
  519. * @throws NullPointerException ArrayList不支持null,但c中包含null元素時,拋出該
  520. * 異常
  521. */
  522. publicboolean retainAll(Collection<?> c){
  523. Objects.requireNonNull(c);
  524. return batchRemove(c,true);
  525. }
  526. /**
  527. * 批量刪除, complement爲true時,保留與c中相同的元素,不然,保留與c中不相同的元素
  528. */
  529. privateboolean batchRemove(Collection<?> c,boolean complement){
  530. finalObject[] elementData =this.elementData;
  531. int r =0, w =0;
  532. boolean modified =false;
  533. try{
  534. for(; r < size; r++)
  535. if(c.contains(elementData[r])== complement)
  536. elementData[w++]= elementData[r];
  537. }finally{
  538. //保護動做,當c.contains()拋出異常時,將剩餘的(r以後的)元素保留
  539. if(r != size){
  540. System.arraycopy(elementData, r,
  541. elementData, w,
  542. size - r);
  543. w += size - r;
  544. }
  545. if(w != size){
  546. // 有元素須要被移除時,釋放引用,以讓垃圾回收器回收
  547. for(int i = w; i < size; i++)
  548. elementData[i]=null;
  549. modCount += size - w;
  550. size = w;
  551. modified =true;
  552. }
  553. }
  554. return modified;
  555. }
  556. /**
  557. * 將一個ArrayList實例的狀態保存到流中,也即序列化,這是類實現的序列化機制,不是默認
  558. * 的序列化機制
  559. *
  560. * @serialData The length of the array backing the <tt>ArrayList</tt>
  561. * instance is emitted (int), followed by all of its elements
  562. * (each an <tt>Object</tt>) in the proper order.
  563. */
  564. privatevoid writeObject(java.io.ObjectOutputStream s)
  565. throws java.io.IOException{
  566. // Write out element count, and any hidden stuff
  567. int expectedModCount = modCount;
  568. s.defaultWriteObject();//默認序列化,記錄列表中元素的個數
  569. // 將列表大小做爲容量保存,以此適用於clone()
  570. s.writeInt(size);
  571. // 按照正確順序保存列表中的元素
  572. for(int i=0; i<size; i++){
  573. s.writeObject(elementData[i]);
  574. }
  575. //序列化過程當中是否有修改列表的結構(擴容,添加,移除操做)
  576. //若是有,則拋出ConcurrentModificationException異常
  577. if(modCount != expectedModCount){
  578. thrownewConcurrentModificationException();
  579. }
  580. }
  581. /**
  582. * 從流中讀取並從新建立Arraylist,也即反序列化
  583. */
  584. privatevoid readObject(java.io.ObjectInputStream s)
  585. throws java.io.IOException,ClassNotFoundException{
  586. elementData = EMPTY_ELEMENTDATA;
  587. // Read in size, and any hidden stuff
  588. s.defaultReadObject();//默認反序列化,讀取列表元素個數
  589. // 讀取容量,忽略
  590. s.readInt();// ignored
  591. if(size >0){
  592. // 相似於clone(),建立大小與元素個數相同的數組
  593. ensureCapacityInternal(size);
  594. Object[] a = elementData;
  595. // 以正確的順序讀取全部的元素
  596. for(int i=0; i<size; i++){
  597. a[i]= s.readObject();
  598. }
  599. }
  600. }
  601. /**
  602. * 建立一個從index開始的ListIterator(第一次調用next,返回index處的元素),調用
  603. * previous,則返回index-1處的元素,首先檢查index的正確性
  604. *
  605. * The returned list iterator is fail-fast
  606. *
  607. * @throws IndexOutOfBoundsException {@inheritDoc}
  608. */
  609. publicListIterator<E> listIterator(int index){
  610. if(index <0|| index > size)
  611. thrownewIndexOutOfBoundsException("Index: "+index);
  612. returnnewListItr(index);
  613. }
  614. /**
  615. * 重載,建立一個默認從0開始的ListIterator
  616. *
  617. * The returned list iterator is fail-fast
  618. *
  619. * @see #listIterator(int)
  620. */
  621. publicListIterator<E> listIterator(){
  622. returnnewListItr(0);
  623. }
  624. /**
  625. * 按照正確的順序,產生一個iterator
  626. *
  627. * @return an iterator over the elements in this list in proper sequence
  628. */
  629. publicIterator<E> iterator(){
  630. returnnewItr();
  631. }
  632. /**
  633. * AbstractList.Itr的優化
  634. */
  635. privateclassItrimplementsIterator<E>{
  636. int cursor;// 下一個元素的遊標(索引)
  637. int lastRet =-1;// 上一次返回的元素的索引
  638. int expectedModCount = modCount;
  639. //是否存在下一個,沒有遍歷到末尾,返回true
  640. publicboolean hasNext(){
  641. return cursor != size;
  642. }
  643. //返回下一個元素
  644. @SuppressWarnings("unchecked")
  645. public E next(){
  646. //檢查迭代器過程當中,是否有修改ArrayList的實例的結構
  647. //有則拋出ConcurrentModificationException異常
  648. checkForComodification();
  649. int i = cursor;
  650. if(i >= size)
  651. thrownewNoSuchElementException();//超出size範圍,則拋出異常
  652. Object[] elementData =ArrayList.this.elementData;
  653. if(i >= elementData.length)
  654. thrownewConcurrentModificationException();
  655. cursor = i +1;//記錄下一個元素的遊標值
  656. return(E) elementData[lastRet = i];
  657. }
  658. //移除當前的元素(next()得到的元素,cursor已經指向下一個)
  659. publicvoid remove(){
  660. //上一個元素不存在
  661. if(lastRet <0)
  662. thrownewIllegalStateException();
  663. checkForComodification();//檢查是否修改
  664. try{
  665. ArrayList.this.remove(lastRet);//移除lastRet處的元素
  666. cursor = lastRet;
  667. lastRet =-1;
  668. expectedModCount = modCount;
  669. }catch(IndexOutOfBoundsException ex){
  670. thrownewConcurrentModificationException();
  671. }
  672. }
  673. /**
  674. * 對剩餘未迭代的元素進行指定操做,直到全部的元素都已經被處理或行動將拋出一個異常
  675. */
  676. @Override
  677. @SuppressWarnings("unchecked")
  678. publicvoid forEachRemaining(Consumer<?super E> consumer){
  679. Objects.requireNonNull(consumer);
  680. finalint size =ArrayList.this.size;
  681. int i = cursor;
  682. //已經遍歷完成,不須要繼續遍歷
  683. if(i >= size){
  684. return;
  685. }
  686. finalObject[] elementData =ArrayList.this.elementData;
  687. if(i >= elementData.length){
  688. thrownewConcurrentModificationException();
  689. }
  690. while(i != size && modCount == expectedModCount){
  691. consumer.accept((E) elementData[i++]);
  692. }
  693. // 更新遊標和上一次返回的元素,並檢測是否修改了列表結構
  694. cursor = i;
  695. lastRet = i -1;
  696. checkForComodification();
  697. }
  698. finalvoid checkForComodification(){
  699. if(modCount != expectedModCount)
  700. thrownewConcurrentModificationException();
  701. }
  702. }
  703. /**
  704. * AbstractList.ListItr的優化,繼承自Iter
  705. */
  706. privateclassListItrextendsItrimplementsListIterator<E>{
  707. ListItr(int index){
  708. super();
  709. cursor = index;//指定第一個須要返回的元素爲index
  710. }
  711. //返回是否有前一個元素,直到到列表的第0個元素
  712. publicboolean hasPrevious(){
  713. return cursor !=0;
  714. }
  715. //返回下一個元素的遊標
  716. publicint nextIndex(){
  717. return cursor;
  718. }
  719. //返回上一個元素的遊標
  720. publicint previousIndex(){
  721. return cursor -1;
  722. }
  723. //獲取上一個元素
  724. @SuppressWarnings("unchecked")
  725. public E previous(){
  726. checkForComodification();//檢查是否修改了列表的結構
  727. int i = cursor -1;//得到上一個元素索引
  728. //數組越界則拋出異常
  729. if(i <0)
  730. thrownewNoSuchElementException();
  731. Object[] elementData =ArrayList.this.elementData;
  732. if(i >= elementData.length)
  733. thrownewConcurrentModificationException();
  734. cursor = i;//修改遊標,下一個元素仍是當前返回的previous元素
  735. return(E) elementData[lastRet = i];
  736. }
  737. //設置當前元素(lastRet指向的值)的值爲e
  738. publicvoidset(E e){
  739. if(lastRet <0)
  740. thrownewIllegalStateException();
  741. checkForComodification();
  742. try{
  743. ArrayList.this.set(lastRet, e);
  744. }catch(IndexOutOfBoundsException ex){
  745. thrownewConcurrentModificationException();
  746. }
  747. }
  748. //在下一個遊標處添加一個元素(remove的時候,遊標回到移除的元素位置)
  749. publicvoid add(E e){
  750. checkForComodification();
  751. try{
  752. int i = cursor;
  753. ArrayList.this.add(i, e);
  754. cursor = i +1;
  755. lastRet =-1;
  756. expectedModCount = modCount;
  757. }catch(IndexOutOfBoundsException ex){
  758. thrownewConcurrentModificationException();
  759. }
  760. }
  761. }
  762. /**
  763. * 返回一個子列表,子列表的範圍爲列表[fromIndex,toIndex)之間的元素,不包括同Index
  764. * 若是fromIndex和同Index相同,則返回空列表
  765. * 不建立新的List,在SubList中持有一個當前ArrayList實例的引用,以及子列表的索引範圍
  766. * 子列表的語義將變得不明確若是當前ArrayList實例結構發生變化(增刪、擴容)
  767. * @throws IndexOutOfBoundsException {@inheritDoc}
  768. * @throws IllegalArgumentException {@inheritDoc}
  769. */
  770. publicList<E> subList(int fromIndex,int toIndex){
  771. subListRangeCheck(fromIndex, toIndex, size);
  772. returnnewSubList(this,0, fromIndex, toIndex);
  773. }
  774. //檢查子列表範圍是否正確
  775. staticvoid subListRangeCheck(int fromIndex,int toIndex,int size){
  776. if(fromIndex <0)
  777. thrownewIndexOutOfBoundsException("fromIndex = "+ fromIndex);
  778. if(toIndex > size)
  779. thrownewIndexOutOfBoundsException("toIndex = "+ toIndex);
  780. if(fromIndex > toIndex)
  781. thrownewIllegalArgumentException("fromIndex("+ fromIndex +
  782. ") > toIndex("+ toIndex +")");
  783. }
  784. /*Sublist-Start*/
  785. //定義子列表類,維持一個得到子列表的ArrayList實例以及偏移量
  786. //子列表偏移量和列表大小
  787. privateclassSubListextendsAbstractList<E>implementsRandomAccess{
  788. privatefinalAbstractList<E> parent;
  789. privatefinalint parentOffset;
  790. privatefinalint offset;
  791. int size;
  792. //構造方法,傳入父列表,子列表偏移量,開始的索引和結束的索引
  793. SubList(AbstractList<E> parent,
  794. int offset,int fromIndex,int toIndex){
  795. this.parent = parent;
  796. this.parentOffset = fromIndex;
  797. this.offset = offset + fromIndex;
  798. this.size = toIndex - fromIndex;
  799. this.modCount =ArrayList.this.modCount;
  800. }
  801. //設置index處的值爲e,直接操做父列表,須要檢查範圍
  802. public E set(int index, E e){
  803. rangeCheck(index);
  804. checkForComodification();
  805. E oldValue =ArrayList.this.elementData(offset + index);
  806. ArrayList.this.elementData[offset + index]= e;
  807. return oldValue;
  808. }
  809. //獲取index處的值,須要檢查範圍,並檢查是否有修改
  810. public E get(int index){
  811. rangeCheck(index);
  812. checkForComodification();
  813. returnArrayList.this.elementData(offset + index);
  814. }
  815. //得到子列表的大小,檢查是否有修改
  816. publicint size(){
  817. checkForComodification();
  818. returnthis.size;
  819. }
  820. //在index處添加一個元素e,須要檢查範圍和是否有修改
  821. publicvoid add(int index, E e){
  822. rangeCheckForAdd(index);
  823. checkForComodification();
  824. parent.add(parentOffset + index, e);
  825. this.modCount = parent.modCount;
  826. this.size++;
  827. }
  828. //移除index處的元素,並返回刪除的元素
  829. public E remove(int index){
  830. rangeCheck(index);
  831. checkForComodification();
  832. E result = parent.remove(parentOffset + index);
  833. this.modCount = parent.modCount;
  834. this.size--;
  835. return result;
  836. }
  837. //移除[fromIndex,toIndex)之間的元素,檢查是否有修改列表結構
  838. protectedvoid removeRange(int fromIndex,int toIndex){
  839. checkForComodification();
  840. parent.removeRange(parentOffset + fromIndex,
  841. parentOffset + toIndex);
  842. this.modCount = parent.modCount;
  843. this.size -= toIndex - fromIndex;
  844. }
  845. //在子列表末尾添加c中全部元素
  846. publicboolean addAll(Collection<?extends E> c){
  847. return addAll(this.size, c);
  848. }
  849. //在子列表index起添加c中全部元素,須要檢查範圍和是否有修改
  850. publicboolean addAll(int index,Collection<?extends E> c){
  851. rangeCheckForAdd(index);
  852. int cSize = c.size();
  853. if(cSize==0)
  854. returnfalse;
  855. checkForComodification();
  856. parent.addAll(parentOffset + index, c);
  857. this.modCount = parent.modCount;
  858. this.size += cSize;
  859. returntrue;
  860. }
  861. //得到迭代器
  862. publicIterator<E> iterator(){
  863. return listIterator();
  864. }
  865. //得到ListIterator迭代器(可向前、向後)
  866. publicListIterator<E> listIterator(finalint index){
  867. checkForComodification();
  868. rangeCheckForAdd(index);
  869. finalint offset =this.offset;
  870. returnnewListIterator<E>(){
  871. int cursor = index;
  872. int lastRet =-1;
  873. int expectedModCount =ArrayList.this.modCount;
  874. publicboolean hasNext(){
  875. return cursor !=SubList.this.size;
  876. }
  877. @SuppressWarnings("unchecked")
  878. public E next(){
  879. checkForComodification();
  880. int i = cursor;
  881. if(i >=SubList.this.size)
  882. thrownewNoSuchElementException();
  883. Object[] elementData =ArrayList.this.elementData;
  884. if(offset + i >= elementData.length)
  885. thrownewConcurrentModificationException();
  886. cursor = i +1;
  887. return(E) elementData[offset +(lastRet = i)];
  888. }
  889. publicboolean hasPrevious(){
  890. return cursor !=0;
  891. }
  892. @SuppressWarnings("unchecked")
  893. public E previous(){
  894. checkForComodification();
  895. int i = cursor -1;
  896. if(i <0)
  897. thrownewNoSuchElementException();
  898. Object[] elementData =ArrayList.this.elementData;
  899. if(offset + i >= elementData.length)
  900. thrownewConcurrentModificationException();
  901. cursor = i;
  902. return(E) elementData[offset +(lastRet = i)];
  903. }
  904. //對未迭代的元素進行特定的操做,並將遊標移到迭代完成的位置
  905. @SuppressWarnings("unchecked")
  906. publicvoid forEachRemaining(Consumer<?super E> consumer){
  907. Objects.requireNonNull(consumer);
  908. finalint size =SubList.this.size;
  909. int i = cursor;
  910. if(i >= size){
  911. return;
  912. }
  913. finalObject[] elementData =ArrayList.this.elementData;
  914. if(offset + i >= elementData.length){
  915. thrownewConcurrentModificationException();
  916. }
  917. while(i != size && modCount == expectedModCount){
  918. consumer.accept((E) elementData[offset +(i++)]);
  919. }
  920. //更新遊標
  921. lastRet = cursor = i;
  922. checkForComodification();
  923. }
  924. publicint nextIndex(){
  925. return cursor;
  926. }
  927. publicint previousIndex(){
  928. return cursor -1;
  929. }
  930. publicvoid remove(){
  931. if(lastRet <0)
  932. thrownewIllegalStateException();
  933. checkForComodification();
  934. try{
  935. SubList.this.remove(lastRet);
  936. cursor = lastRet;
  937. lastRet =-1;
  938. expectedModCount =ArrayList.this.modCount;
  939. }catch(IndexOutOfBoundsException ex){
  940. thrownewConcurrentModificationException();
  941. }
  942. }
  943. publicvoidset(E e){
  944. if(lastRet <0)
  945. thrownewIllegalStateException();
  946. checkForComodification();
  947. try{
  948. ArrayList.this.set(offset + lastRet, e);
  949. }catch(IndexOutOfBoundsException ex){
  950. thrownewConcurrentModificationException();
  951. }
  952. }
  953. publicvoid add(E e){
  954. checkForComodification();
  955. try{
  956. int i = cursor;
  957. SubList.this.add(i, e);
  958. cursor = i +1;
  959. lastRet =-1;
  960. expectedModCount =ArrayList.this.modCount;
  961. }catch(IndexOutOfBoundsException ex){
  962. thrownewConcurrentModificationException();
  963. }
  964. }
  965. finalvoid checkForComodification(){
  966. if(expectedModCount !=ArrayList.this.modCount)
  967. thrownewConcurrentModificationException();
  968. }
  969. };
  970. }
  971. //從當前子序列得到子序列,offset當前子列表位於最原始的列表的偏移
  972. publicList<E> subList(int fromIndex,int toIndex){
  973. subListRangeCheck(fromIndex, toIndex, size);
  974. returnnewSubList(this, offset, fromIndex, toIndex);
  975. }
  976. //檢查當前索引的範圍是否正確
  977. privatevoid rangeCheck(int index){
  978. if(index <0|| index >=this.size)
  979. thrownewIndexOutOfBoundsException(outOfBoundsMsg(index));
  980. }
  981. //檢查當前索引的範圍是否正確
  982. privatevoid rangeCheckForAdd(int index){
  983. if(index <0|| index >this.size)
  984. thrownewIndexOutOfBoundsException(outOfBoundsMsg(index));
  985. }
  986. //生成索引越界錯誤消息
  987. privateString outOfBoundsMsg(int index){
  988. return"Index: "+index+", Size: "+this.size;
  989. }
  990. //判斷是否有修改
  991. privatevoid checkForComodification(){
  992. if(ArrayList.this.modCount !=this.modCount)
  993. thrownewConcurrentModificationException();
  994. }
  995. publicSpliterator<E> spliterator(){
  996. checkForComodification();
  997. //子列表的已經不是第一次使用
  998. //fence 爲父列表中屬於子列表的最後一個元素的索引
  999. returnnewArrayListSpliterator<E>(ArrayList.this, offset,
  1000. offset +this.size,this.modCount);
  1001. }
  1002. }
  1003. /**
  1004. * 對數組中的元素執行特定的操做,不容許在此過程當中修改
  1005. */
  1006. @Override
  1007. publicvoid forEach(Consumer<?super E> action){
  1008. Objects.requireNonNull(action);
  1009. finalint expectedModCount = modCount;
  1010. @SuppressWarnings("unchecked")
  1011. final E[] elementData =(E[])this.elementData;
  1012. finalint size =this.size;
  1013. for(int i=0; modCount == expectedModCount && i < size; i++){
  1014. action.accept(elementData[i]);
  1015. }
  1016. if(modCount != expectedModCount){
  1017. thrownewConcurrentModificationException();
  1018. }
  1019. }
  1020. /**
  1021. * 在列表上建立一個延遲綁定和fail-fast機制
  1022. *
  1023. * Spliterator提供列表的遍歷和元素分割
  1024. *
  1025. * @return a {@code Spliterator} over the elements in this list
  1026. * @since 1.8
  1027. */
  1028. @Override
  1029. publicSpliterator<E> spliterator(){
  1030. returnnewArrayListSpliterator<>(this,0,-1,0);
  1031. }
  1032. /** Index-based split-by-two, lazily initialized Spliterator */
  1033. staticfinalclassArrayListSpliterator<E>implementsSpliterator<E>{
  1034. /*
  1035. * 實在看不懂 ==!
  1036. * 若是ArrayList是不可變或者結構上不可變的(adds,removs等),可使用
  1037. * Arrays.spliterator來實現。遍歷過程當中,不犧牲太多性能的狀況下,咱們能夠檢測到
  1038. * 干擾。(不太通,Instead we detect as much interference during traversal
  1039. * as practical without sacrificing much performance.) 咱們主要依賴於
  1040. * modCounts。雖然這並不能保證檢查到併發訪問衝突,並且有時對於線程間的干擾過於保
  1041. * 守,可是發現足夠的問題在實踐中是值得的。爲了實現這個功能,作了如下幾點:
  1042. * 1. 延遲初始化fence和expectedModCount直到須要咱們提交咱們正在檢測的狀態信息
  1043. * 以此提升精確性(這不適用於子列表,子列表使用非延遲加載值)
  1044. * 2. 只在forEach結束時檢測一次ConcurrentModificationException異常(性能最
  1045. * 敏感的方法)。使用forEach(與迭代器相反),咱們一般只能在action操做以後檢測
  1046. * 干擾,而不是開始以前。由於干擾的緣由,假設如null或者列表元素很小,更進一步的
  1047. * CME-triggering檢測將應用於全部的可能破外。這容許forEach內部的循環在運行時不
  1048. * 進行進一步檢查,簡化lambda表達式的操做。雖然這確實須要大量的檢查(
  1049. * list.stream().forEach(a)相同的狀況), 沒有其餘的檢測和計算髮生在forEach內,
  1050. * 其餘不常使用的方法不能從流中得到大部分性能
  1051. */
  1052. privatefinalArrayList<E> list;
  1053. privateint index;// 當前的索引(advance/split操做的對象)
  1054. privateint fence;// -1 until used; then one past last index
  1055. privateint expectedModCount;// 當fence設置後初始化
  1056. /** 根據範圍建立一個Spliterator */
  1057. ArrayListSpliterator(ArrayList<E> list,int origin,int fence,
  1058. int expectedModCount){
  1059. this.list = list;// 能夠是null(除非須要遍歷)
  1060. this.index = origin;
  1061. this.fence = fence;
  1062. this.expectedModCount = expectedModCount;
  1063. }
  1064. privateint getFence(){// 第一次使用時,初始化fence爲size
  1065. int hi;// (a specialized variant appears in method forEach)
  1066. ArrayList<E> lst;
  1067. if((hi = fence)<0){//第一次使用,則初始化
  1068. if((lst = list)==null)
  1069. hi = fence =0;
  1070. else{
  1071. expectedModCount = lst.modCount;//初始化expectedModCount
  1072. hi = fence = lst.size;
  1073. }
  1074. }
  1075. return hi;
  1076. }
  1077. publicArrayListSpliterator<E> trySplit(){
  1078. //求中間索引,>>>無符號右移,高位補0
  1079. int hi = getFence(), lo = index, mid =(lo + hi)>>>1;
  1080. return(lo >= mid)?null:// 分紅兩份,若是列表過小返回null
  1081. newArrayListSpliterator<E>(list, lo, index = mid,
  1082. expectedModCount);
  1083. }
  1084. //執行特定操做,用於遍歷,每調用一次,index增大,知道fence(也即到列表末尾)
  1085. publicboolean tryAdvance(Consumer<?super E> action){
  1086. if(action ==null)
  1087. thrownewNullPointerException();
  1088. int hi = getFence(), i = index;
  1089. if(i < hi){
  1090. index = i +1;
  1091. @SuppressWarnings("unchecked") E e =(E)list.elementData[i];
  1092. action.accept(e);
  1093. if(list.modCount != expectedModCount)
  1094. thrownewConcurrentModificationException();
  1095. returntrue;
  1096. }
  1097. returnfalse;
  1098. }
  1099. //遍歷執行特定操做
  1100. publicvoid forEachRemaining(Consumer<?super E> action){
  1101. int i, hi, mc;// hoist accesses and checks from loop
  1102. ArrayList<E> lst;Object[] a;
  1103. if(action ==null)
  1104. thrownewNullPointerException();
  1105. if((lst = list)!=null&&(a = lst.elementData)!=null){
  1106. if((hi = fence)<0){
  1107. mc = lst.modCount;
  1108. hi = lst.size;
  1109. }
  1110. else
  1111. mc = expectedModCount;
  1112. if((i = index)>=0&&(index = hi)<= a.length){
  1113. for(; i < hi;++i){
  1114. @SuppressWarnings("unchecked") E e =(E) a[i];
  1115. action.accept(e);
  1116. }
  1117. if(lst.modCount == mc)
  1118. return;
  1119. }
  1120. }
  1121. thrownewConcurrentModificationException();
  1122. }
  1123. //得到還剩餘的未遍歷的元素數
  1124. publiclong estimateSize(){
  1125. return(long)(getFence()- index);
  1126. }
  1127. //Spliterator特徵
  1128. publicint characteristics(){
  1129. returnSpliterator.ORDERED |Spliterator.SIZED |Spliterator.SUBSIZED;
  1130. }
  1131. }
  1132. /**
  1133. * 根據條件移除元素,元素有移除,則返回true
  1134. */
  1135. @Override
  1136. publicboolean removeIf(Predicate<?super E> filter){
  1137. Objects.requireNonNull(filter);
  1138. // figure out which elements are to be removed
  1139. // any exception thrown from the filter predicate at this stage
  1140. // will leave the collection unmodified
  1141. int removeCount =0;
  1142. finalBitSet removeSet =newBitSet(size);
  1143. finalint expectedModCount = modCount;
  1144. finalint size =this.size;
  1145. for(int i=0; modCount == expectedModCount && i < size; i++){
  1146. @SuppressWarnings("unchecked")
  1147. final E element =(E) elementData[i];
  1148. if(filter.test(element)){
  1149. removeSet.set(i);//設置第i位爲1,標記移除
  1150. removeCount++;//記錄移除的記錄數
  1151. }
  1152. }
  1153. //此過程當中發生列表結構修改,拋出異常
  1154. if(modCount != expectedModCount){
  1155. thrownewConcurrentModificationException();
  1156. }
  1157. // 將沒有移除的元素向前移動
  1158. finalboolean anyToRemove = removeCount >0;
  1159. if(anyToRemove){
  1160. finalint newSize = size - removeCount;
  1161. for(int i=0, j=0;(i < size)&&(j < newSize); i++, j++){
  1162. //找到i以後第一個爲false的index,也即未標記移除的
  1163. i = removeSet.nextClearBit(i);
  1164. elementData[j]= elementData[i];
  1165. }
  1166. for(int k=newSize; k < size; k++){
  1167. elementData[k]=null;//清除須要刪除的引用,以讓垃圾回收器回收
  1168. }
  1169. this.size = newSize;//更新尺寸
  1170. //此過程當中發生列表結構修改,拋出異常
  1171. if(modCount != expectedModCount){
  1172. thrownewConcurrentModificationException();
  1173. }
  1174. modCount++;
  1175. }
  1176. //移除元素,則返回true
  1177. return anyToRemove;
  1178. }
  1179. /**
  1180. * 對列表中每個元素根據傳入的UnaryOperator,執行特定操做,並用返回值替換原來的值
  1181. */
  1182. @Override
  1183. @SuppressWarnings("unchecked")
  1184. publicvoid replaceAll(UnaryOperator<E>operator){
  1185. Objects.requireNonNull(operator);
  1186. finalint expectedModCount = modCount;
  1187. finalint size =this.size;
  1188. for(int i=0; modCount == expectedModCount && i < size; i++){
  1189. //執行特定操做,並用返回值替換原來的值
  1190. elementData[i]=operator.apply((E) elementData[i]);
  1191. }
  1192. if(modCount != expectedModCount){
  1193. thrownewConcurrentModificationException();
  1194. }
  1195. modCount++;
  1196. }
  1197. //根據傳入的比較器c對列表進行排序
  1198. @Override
  1199. @SuppressWarnings("unchecked")
  1200. publicvoid sort(Comparator<?super E> c){
  1201. finalint expectedModCount = modCount;
  1202. Arrays.sort((E[]) elementData,0, size, c);
  1203. //排序過程當中發生列表結構變化,則拋出異常
  1204. if(modCount != expectedModCount){
  1205. thrownewConcurrentModificationException();
  1206. }
  1207. modCount++;
  1208. }
  1209. }

ArrayList 中的很大部分操做,使用了Arrays.copyof()和System.arraycopy()進行數組的拷貝,須要進一步分析其源碼
列表的排序使用Arrays.sort(),進一步分析其源碼java



相關文章
相關標籤/搜索