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

資訊專欄INFORMATION COLUMN

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

ThinkSNS / 2704人閱讀

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

ArrayList簡介

ArrayList是基于數組實現的,是一個動態數組,其容量能自動增長,類似于C語言中的動態申請內存,動態增長內存。
ArrayList不是線程安全的,只能用在單線程環境下,多線程環境下可以考慮用Collections.synchronizedList(List l)函數返回一個線程安全的ArrayList類,也可以使用concurrent并發包下的CopyOnWriteArrayList類。
ArrayList實現了Serializable接口,因此它支持序列化,能夠通過序列化傳輸,實現了RandomAccess接口,支持快速隨機訪問,實際上就是通過下標序號進行快速訪問,實現了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基于該數組實現,用該數組保存數據   
   private transient Object[] elementData;    
  
   // ArrayList中實際數據的數量    
   private int size;    
  
   // ArrayList帶容量大小的構造函數。    
   public ArrayList(int initialCapacity) {    
       super();    
       if (initialCapacity < 0)    
           throw new IllegalArgumentException("Illegal Capacity: "+    
                                              initialCapacity);    
       // 新建一個數組    
       this.elementData = new Object[initialCapacity];    
   }    
  
   // ArrayList無參構造函數。默認容量是10。    
   public ArrayList() {    
       this(10);    
   }    
  
   // 創建一個包含collection的ArrayList    
   public ArrayList(Collection c) {    
       elementData = c.toArray();    
       size = elementData.length;    
       if (elementData.getClass() != Object[].class)    
           elementData = Arrays.copyOf(elementData, size, Object[].class);    
   }    
  
  
   // 將當前容量值設為實際元素個數    
   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) {    
       // 將“修改統計數”+1,該變量主要是用來實現fail-fast機制的    
       modCount++;    
       int oldCapacity = elementData.length;    
       // 若當前容量不足以容納當前的元素個數,設置 新的容量=“(原始容量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;    
   }    
  
   // 反向查找(從數組末尾向開始查找),返回元素(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數組    
   public Object[] toArray() {    
       return Arrays.copyOf(elementData, size);    
   }    
  
   // 返回ArrayList元素組成的數組  
   public  T[] toArray(T[] a) {    
       // 若數組a的大小 < ArrayList的元素個數;    
       // 則新建一個T[]數組,數組大小是“ArrayList的元素個數”,并將“ArrayList”全部拷貝到新數組中    
       if (a.length < size)    
           return (T[]) Arrays.copyOf(elementData, size, a.getClass());    
  
       // 若數組a的大小 >= ArrayList的元素個數;    
       // 則將ArrayList的全部元素都拷貝到數組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);    
   }    
  
  
   // 克隆函數    
   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的寫入函數    
   // 將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();    
  
       // 寫入“數組的容量”    
       s.writeInt(elementData.length);    
  
   // 寫入“數組的每一個元素”    
   for (int i=0; i

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69565.html

相關文章

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

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

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

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

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

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

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

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

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

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

    n7then 評論0 收藏0

發表評論

0條評論

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