国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

站在巨人肩膀上看源碼-ArrayList

ThinkSNS / 2699人閱讀

摘要:源碼剖析的源碼如下加入了比較詳細的注釋序列版本號基于該數(shù)組實現(xiàn),用該數(shù)組保存數(shù)據(jù)中實際數(shù)據(jù)的數(shù)量帶容量大小的構(gòu)造函數(shù)。該方法被標記了,調(diào)用了系統(tǒng)的代碼,在中是看不到的,但在中可以看到其源碼。

ArrayList簡介

ArrayList是基于數(shù)組實現(xiàn)的,是一個動態(tài)數(shù)組,其容量能自動增長,類似于C語言中的動態(tài)申請內(nèi)存,動態(tài)增長內(nèi)存。
ArrayList不是線程安全的,只能用在單線程環(huán)境下,多線程環(huán)境下可以考慮用Collections.synchronizedList(List l)函數(shù)返回一個線程安全的ArrayList類,也可以使用concurrent并發(fā)包下的CopyOnWriteArrayList類。
ArrayList實現(xiàn)了Serializable接口,因此它支持序列化,能夠通過序列化傳輸,實現(xiàn)了RandomAccess接口,支持快速隨機訪問,實際上就是通過下標序號進行快速訪問,實現(xiàn)了Cloneable接口,能被克隆。

ArrayList源碼剖析

ArrayList的源碼如下(加入了比較詳細的注釋):

package java.util;    
  
public class ArrayList extends AbstractList    
       implements List, RandomAccess, Cloneable, java.io.Serializable    
{    
   // 序列版本號    
   private static final long serialVersionUID = 8683452581122892189L;    
  
   // ArrayList基于該數(shù)組實現(xiàn),用該數(shù)組保存數(shù)據(jù)   
   private transient Object[] elementData;    
  
   // ArrayList中實際數(shù)據(jù)的數(shù)量    
   private int size;    
  
   // ArrayList帶容量大小的構(gòu)造函數(shù)。    
   public ArrayList(int initialCapacity) {    
       super();    
       if (initialCapacity < 0)    
           throw new IllegalArgumentException("Illegal Capacity: "+    
                                              initialCapacity);    
       // 新建一個數(shù)組    
       this.elementData = new Object[initialCapacity];    
   }    
  
   // ArrayList無參構(gòu)造函數(shù)。默認容量是10。    
   public ArrayList() {    
       this(10);    
   }    
  
   // 創(chuàng)建一個包含collection的ArrayList    
   public ArrayList(Collection c) {    
       elementData = c.toArray();    
       size = elementData.length;    
       if (elementData.getClass() != Object[].class)    
           elementData = Arrays.copyOf(elementData, size, Object[].class);    
   }    
  
  
   // 將當前容量值設為實際元素個數(shù)    
   public void trimToSize() {    
       modCount++;    
       int oldCapacity = elementData.length;    
       if (size < oldCapacity) {    
           elementData = Arrays.copyOf(elementData, size);    
       }    
   }    
  
  
   // 確定ArrarList的容量。    
   // 若ArrayList的容量不足以容納當前的全部元素,設置 新的容量=“(原始容量x3)/2 + 1”    
   public void ensureCapacity(int minCapacity) {    
       // 將“修改統(tǒng)計數(shù)”+1,該變量主要是用來實現(xiàn)fail-fast機制的    
       modCount++;    
       int oldCapacity = elementData.length;    
       // 若當前容量不足以容納當前的元素個數(shù),設置 新的容量=“(原始容量x3)/2 + 1”    
       if (minCapacity > oldCapacity) {    
           Object oldData[] = elementData;    
           int newCapacity = (oldCapacity * 3)/2 + 1;    
           //如果還不夠,則直接將minCapacity設置為當前容量  
           if (newCapacity < minCapacity)    
               newCapacity = minCapacity;    
           elementData = Arrays.copyOf(elementData, newCapacity);    
       }    
   }    
  
   // 添加元素e    
   public boolean add(E e) {    
       // 確定ArrayList的容量大小    
       ensureCapacity(size + 1);  // Increments modCount!!    
       // 添加e到ArrayList中    
       elementData[size++] = e;    
       return true;    
   }    
  
   // 返回ArrayList的實際大小    
   public int size() {    
       return size;    
   }    
  
   // ArrayList是否包含Object(o)    
   public boolean contains(Object o) {    
       return indexOf(o) >= 0;    
   }    
  
   //返回ArrayList是否為空    
   public boolean isEmpty() {    
       return size == 0;    
   }    
  
   // 正向查找,返回元素的索引值    
   public int indexOf(Object o) {    
       if (o == null) {    
           for (int i = 0; i < size; i++)    
           if (elementData[i]==null)    
               return i;    
           } else {    
               for (int i = 0; i < size; i++)    
               if (o.equals(elementData[i]))    
                   return i;    
           }    
           return -1;    
       }    
  
       // 反向查找,返回元素的索引值    
       public int lastIndexOf(Object o) {    
       if (o == null) {    
           for (int i = size-1; i >= 0; i--)    
           if (elementData[i]==null)    
               return i;    
       } else {    
           for (int i = size-1; i >= 0; i--)    
           if (o.equals(elementData[i]))    
               return i;    
       }    
       return -1;    
   }    
  
   // 反向查找(從數(shù)組末尾向開始查找),返回元素(o)的索引值    
   public int lastIndexOf(Object o) {    
       if (o == null) {    
           for (int i = size-1; i >= 0; i--)    
           if (elementData[i]==null)    
               return i;    
       } else {    
           for (int i = size-1; i >= 0; i--)    
           if (o.equals(elementData[i]))    
               return i;    
       }    
       return -1;    
   }    
    
  
   // 返回ArrayList的Object數(shù)組    
   public Object[] toArray() {    
       return Arrays.copyOf(elementData, size);    
   }    
  
   // 返回ArrayList元素組成的數(shù)組  
   public  T[] toArray(T[] a) {    
       // 若數(shù)組a的大小 < ArrayList的元素個數(shù);    
       // 則新建一個T[]數(shù)組,數(shù)組大小是“ArrayList的元素個數(shù)”,并將“ArrayList”全部拷貝到新數(shù)組中    
       if (a.length < size)    
           return (T[]) Arrays.copyOf(elementData, size, a.getClass());    
  
       // 若數(shù)組a的大小 >= ArrayList的元素個數(shù);    
       // 則將ArrayList的全部元素都拷貝到數(shù)組a中。    
       System.arraycopy(elementData, 0, a, 0, size);    
       if (a.length > size)    
           a[size] = null;    
       return a;    
   }    
  
   // 獲取index位置的元素值    
   public E get(int index) {    
       RangeCheck(index);    
  
       return (E) elementData[index];    
   }    
  
   // 設置index位置的值為element    
   public E set(int index, E element) {    
       RangeCheck(index);    
  
       E oldValue = (E) elementData[index];    
       elementData[index] = element;    
       return oldValue;    
   }    
  
   // 將e添加到ArrayList中    
   public boolean add(E e) {    
       ensureCapacity(size + 1);  // Increments modCount!!    
       elementData[size++] = e;    
       return true;    
   }    
  
   // 將e添加到ArrayList的指定位置    
   public void add(int index, E element) {    
       if (index > size || index < 0)    
           throw new IndexOutOfBoundsException(    
           "Index: "+index+", Size: "+size);    
  
       ensureCapacity(size+1);  // Increments modCount!!    
       System.arraycopy(elementData, index, elementData, index + 1,    
            size - index);    
       elementData[index] = element;    
       size++;    
   }    
  
   // 刪除ArrayList指定位置的元素    
   public E remove(int index) {    
       RangeCheck(index);    
  
       modCount++;    
       E oldValue = (E) elementData[index];    
  
       int numMoved = size - index - 1;    
       if (numMoved > 0)    
           System.arraycopy(elementData, index+1, elementData, index,    
                numMoved);    
       elementData[--size] = null; // Let gc do its work    
  
       return oldValue;    
   }    
  
   // 刪除ArrayList的指定元素    
   public boolean remove(Object o) {    
       if (o == null) {    
               for (int index = 0; index < size; index++)    
           if (elementData[index] == null) {    
               fastRemove(index);    
               return true;    
           }    
       } else {    
           for (int index = 0; index < size; index++)    
           if (o.equals(elementData[index])) {    
               fastRemove(index);    
               return true;    
           }    
       }    
       return false;    
   }    
  
  
   // 快速刪除第index個元素    
   private void fastRemove(int index) {    
       modCount++;    
       int numMoved = size - index - 1;    
       // 從"index+1"開始,用后面的元素替換前面的元素。    
       if (numMoved > 0)    
           System.arraycopy(elementData, index+1, elementData, index,    
                            numMoved);    
       // 將最后一個元素設為null    
       elementData[--size] = null; // Let gc do its work    
   }    
  
   // 刪除元素    
   public boolean remove(Object o) {    
       if (o == null) {    
           for (int index = 0; index < size; index++)    
           if (elementData[index] == null) {    
               fastRemove(index);    
           return true;    
           }    
       } else {    
           // 便利ArrayList,找到“元素o”,則刪除,并返回true。    
           for (int index = 0; index < size; index++)    
           if (o.equals(elementData[index])) {    
               fastRemove(index);    
           return true;    
           }    
       }    
       return false;    
   }    
  
   // 清空ArrayList,將全部的元素設為null    
   public void clear() {    
       modCount++;    
  
       for (int i = 0; i < size; i++)    
           elementData[i] = null;    
  
       size = 0;    
   }    
  
   // 將集合c追加到ArrayList中    
   public boolean addAll(Collection c) {    
       Object[] a = c.toArray();    
       int numNew = a.length;    
       ensureCapacity(size + numNew);  // Increments modCount    
       System.arraycopy(a, 0, elementData, size, numNew);    
       size += numNew;    
       return numNew != 0;    
   }    
  
   // 從index位置開始,將集合c添加到ArrayList    
   public boolean addAll(int index, Collection c) {    
       if (index > size || index < 0)    
           throw new IndexOutOfBoundsException(    
           "Index: " + index + ", Size: " + size);    
  
       Object[] a = c.toArray();    
       int numNew = a.length;    
       ensureCapacity(size + numNew);  // Increments modCount    
  
       int numMoved = size - index;    
       if (numMoved > 0)    
           System.arraycopy(elementData, index, elementData, index + numNew,    
                numMoved);    
  
       System.arraycopy(a, 0, elementData, index, numNew);    
       size += numNew;    
       return numNew != 0;    
   }    
  
   // 刪除fromIndex到toIndex之間的全部元素。    
   protected void removeRange(int fromIndex, int toIndex) {    
   modCount++;    
   int numMoved = size - toIndex;    
       System.arraycopy(elementData, toIndex, elementData, fromIndex,    
                        numMoved);    
  
   // Let gc do its work    
   int newSize = size - (toIndex-fromIndex);    
   while (size != newSize)    
       elementData[--size] = null;    
   }    
  
   private void RangeCheck(int index) {    
   if (index >= size)    
       throw new IndexOutOfBoundsException(    
       "Index: "+index+", Size: "+size);    
   }    
  
  
   // 克隆函數(shù)    
   public Object clone() {    
       try {    
           ArrayList v = (ArrayList) super.clone();    
           // 將當前ArrayList的全部元素拷貝到v中    
           v.elementData = Arrays.copyOf(elementData, size);    
           v.modCount = 0;    
           return v;    
       } catch (CloneNotSupportedException e) {    
           // this shouldn"t happen, since we are Cloneable    
           throw new InternalError();    
       }    
   }    
  
  
   // java.io.Serializable的寫入函數(shù)    
   // 將ArrayList的“容量,所有的元素值”都寫入到輸出流中    
   private void writeObject(java.io.ObjectOutputStream s)    
       throws java.io.IOException{    
   // Write out element count, and any hidden stuff    
   int expectedModCount = modCount;    
   s.defaultWriteObject();    
  
       // 寫入“數(shù)組的容量”    
       s.writeInt(elementData.length);    
  
   // 寫入“數(shù)組的每一個元素”    
   for (int i=0; i

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69565.html

相關(guān)文章

  • 站在巨人肩膀上看源碼-HashSet

    摘要:實際運行上面程序?qū)⒖吹匠绦蜉敵觯@是因為判斷兩個對象相等的標準除了要求通過方法比較返回之外,還要求兩個對象的返回值相等。通常來說,所有參與計算返回值的關(guān)鍵屬性,都應該用于作為比較的標準。 1.HashSet概述:   HashSet實現(xiàn)Set接口,由哈希表(實際上是一個HashMap實例)支持。它不保證set 的迭代順序;特別是它不保證該順序恒久不變。此類允許使用null元素。Hash...

    DevTTL 評論0 收藏0
  • 站在巨人肩膀上看源碼-Map

    摘要:在學習的實現(xiàn)類是基于實現(xiàn)的前,先來介紹下接口及其下的子接口先看下的架構(gòu)圖如上圖是映射接口,中存儲的內(nèi)容是鍵值對。是繼承于的接口。中的內(nèi)容是排序的鍵值對,排序的方法是通過比較器。 Map 在學習Set(Set的實現(xiàn)類是基于Map實現(xiàn)的)、HashMap、TreeMap前,先來介紹下Map接口及其下的子接口.先看下Map的架構(gòu)圖:showImg(https://segmentfault.c...

    xiaotianyi 評論0 收藏0
  • 站在巨人肩膀上看源碼-LinkedList

    摘要:在閱讀源碼之前,我們先對的整體實現(xiàn)進行大致說明實際上是通過雙向鏈表去實現(xiàn)的。獲取的最后一個元素由于是雙向鏈表而表頭不包含數(shù)據(jù)。實際上是判斷雙向鏈表的當前節(jié)點是否達到開頭反向迭代器獲取下一個元素。 第1部分 LinkedList介紹 LinkedList簡介 LinkedList 是一個繼承于AbstractSequentialList的雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操...

    learn_shifeng 評論0 收藏0
  • 站在巨人肩膀上看源碼-HashMap(基于jdk1.8)

    摘要:而中,采用數(shù)組鏈表紅黑樹實現(xiàn),當鏈表長度超過閾值時,將鏈表轉(zhuǎn)換為紅黑樹,這樣大大減少了查找時間。到了,當同一個值的節(jié)點數(shù)不小于時,不再采用單鏈表形式存儲,而是采用紅黑樹,如下圖所示。 一. HashMap概述 在JDK1.8之前,HashMap采用數(shù)組+鏈表實現(xiàn),即使用鏈表處理沖突,同一hash值的節(jié)點都存儲在一個鏈表里。但是當位于一個桶中的元素較多,即hash值相等的元素較多時,通過...

    劉玉平 評論0 收藏0
  • 站在巨人肩膀上看源碼-ConcurrentHashMap

    摘要:一出現(xiàn)背景線程不安全的因為多線程環(huán)境下,使用進行操作會引起死循環(huán),導致利用率接近,所以在并發(fā)情況下不能使用。是由數(shù)組結(jié)構(gòu)和數(shù)組結(jié)構(gòu)組成。用來表示需要進行的界限值。也是,這使得能夠讀取到最新的值而不需要同步。 一、出現(xiàn)背景 1、線程不安全的HashMap 因為多線程環(huán)境下,使用Hashmap進行put操作會引起死循環(huán),導致CPU利用率接近100%,所以在并發(fā)情況下不能使用HashMap。...

    n7then 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<