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

資訊專欄INFORMATION COLUMN

Java ArrayList源碼分析

DevTalking / 1050人閱讀

摘要:構造器提供了三個構造器接口約定,每個集合類應該提供兩個標準構造器,一個是無參數的構造器上面第一個,另外一個是擁有單個參數類型為的構造器上面第二個。還提供了第三個構造器,其接受一個值,用于設置的初始大小默認大小為。

ArrayList介紹

List 接口的一個實現類,內部是用一個數組存儲元素值,相當于一個可變大小的數組。

簽名
public class ArrayList
extends AbstractList
implements List, RandomAccess, Cloneable, Serializable

可以看到ArrayList繼承了AbstractList抽象類,它實現了List接口的大多數方法。如果要實現一個不可變的List,只要繼承這個類并且實現get(int)size方法。如果要實現可變的List,需要覆蓋set(int, E)。另外,如果List的大小是可變的,還要覆蓋add(int, E)remove()方法。

構造器

ArrayList提供了三個構造器:

ArrayList()
ArrayList(Collection c)
ArrayList(int initialCapacity)

Collection接口約定,每個集合類應該提供兩個”標準”構造器,一個是無參數的構造器(上面第一個),另外一個是擁有單個參數(類型為Collettion)的構造器(上面第二個)。ArrayList還提供了第三個構造器,其接受一個int值,用于設置ArrayLi的初始大小(默認大小為10)。

相關方法 trimToSize
public void trimToSize() {
        modCount++;
        int oldCapacity = elementData.length;
        if (size < oldCapacity) {
            elementData = Arrays.copyOf(elementData, size);
        }
    }

用于把ArrayList的容量縮減到當前實際大小,減少存儲容量。其中的變量modCountAbstracList繼承而來,記錄List發生結構化修改(structurally modified)的次數。elementData中實際存儲了ArrayList的元素,在ArrayList中聲明為:private transient Object[] elementData;變量sizeArrayList的元素數量,當size < oldCapacity時,調用Arrays.copyOf方法實現縮減。

indexOflasIndexOf
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;
    }

這兩個方法返回指定元素的下標,要區分參數是否為nulllastIndexOfindexOf類似,只不過是從后往前搜索。

ensureCapacity
public void ensureCapacity(int minCapacity) {
       if (minCapacity > 0)
           ensureCapacityInternal(minCapacity);
   }
private void ensureCapacityInternal(int minCapacity) {
        modCount++;
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

這個方法可以確保ArrayList的大小

addaddAll
public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }

add(int index, E element)向指定位置添加元素,首先調用rangeCheckForAdd檢查index是否有效,如果index > size || index < 0將拋出異常。然后確保容量加1,調用System.arraycopy把從index開始的元素往后移動一個位置。最后把index處的值設置為添加的元素。還有一個重載的add(E e)方法是直接把元素添加到末尾。
addAll(Collection c)addAll(int index, Collection c)則分別是向末尾和指定位置添加Collection中的所有元素。

removeremoveAll
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;
    }

remove(Object o)方法刪除指定的元素。首先是查找元素位置,然后調用fastRemove(index)刪除,其代碼如下:

private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            //把index+1往后的元素都往前移動一個位置
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // Let gc do its work
    }

重載的remove(int index)方法用于刪除指定位置的元素。removeRange(int fromIndex, int toIndex)用于刪除指定位置之間的所有元素。
removeAll(Collection c)retainAll(Collection c)代碼如下:

public boolean removeAll(Collection c) {
        Objects.requireNonNull(c);
        return batchRemove(c, false);
    }
public boolean retainAll(Collection c) {
        Objects.requireNonNull(c);
        return batchRemove(c, true);
    }

它們都是通過調用batchRemove方法實現的,其代碼如下:

private boolean batchRemove(Collection c, boolean complement) {
        final Object[] elementData = this.elementData;
        int r = 0, w = 0;
        boolean modified = false;
        try {
            for (; r < size; r++)
                if (c.contains(elementData[r]) == complement)
                    elementData[w++] = elementData[r];
        } finally {
            // Preserve behavioral compatibility with AbstractCollection,
            // even if c.contains() throws.
            if (r != size) {
                System.arraycopy(elementData, r,
                                 elementData, w,
                                 size - r);
                w += size - r;
            }
            if (w != size) {
                // clear to let GC do its work
                for (int i = w; i < size; i++)
                    elementData[i] = null;
                modCount += size - w;
                size = w;
                modified = true;
            }
        }
        return modified;
    }

這個方法有兩個參數,第一個是操作的Collection,第二個是一個布爾值,通過設置為truefalse來選擇是removeAll還是retainAlltry里面的語句是把留下來的放在0到w之間,然后在finally中第二個if處理w之后的空間,第一個是在c.contains()拋出異常時執行。

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

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

相關文章

  • Java集合源碼分析系列-(一)ArrayList源碼剖析

    摘要:需要注意的是,通過構造函數定義初始量是動態數組的實際大小。帶容量的構造函數新建一個容量為的數組默認構造函數,默認為空構造一個包含指定元素的第一個構造方法使用提供的來初始化數組的大小。 前言 今天介紹經常使用的一個Java集合類——ArrayList(基于JDK1.8.0_121)。ArrayList在工作和日常面試中經常被使用或者提到。總的來說,工作中使用ArrayList主要是因為動...

    Miyang 評論0 收藏0
  • java源碼

    摘要:集合源碼解析回歸基礎,集合源碼解析系列,持續更新和源碼分析與是兩個常用的操作字符串的類。這里我們從源碼看下不同狀態都是怎么處理的。 Java 集合深入理解:ArrayList 回歸基礎,Java 集合深入理解系列,持續更新~ JVM 源碼分析之 System.currentTimeMillis 及 nanoTime 原理詳解 JVM 源碼分析之 System.currentTimeMi...

    Freeman 評論0 收藏0
  • Java集合干貨——ArrayList源碼分析

    摘要:關于的具體實現,一些基本的都也知道,譬如數組實現,線程不安全等等,但是更加具體的就很少去了解了,例如初始化的長度,擴容等。 前言 在之前的文章中我們提到過ArrayList,ArrayList可以說是每一個學java的人使用最多最熟練的集合了,但是知其然不知其所以然。關于ArrayList的具體實現,一些基本的都也知道,譬如數組實現,線程不安全等等,但是更加具體的就很少去了解了,例如:...

    Render 評論0 收藏0
  • Java集合干貨——ArrayList源碼分析

    摘要:關于的具體實現,一些基本的都也知道,譬如數組實現,線程不安全等等,但是更加具體的就很少去了解了,例如初始化的長度,擴容等。 前言 在之前的文章中我們提到過ArrayList,ArrayList可以說是每一個學java的人使用最多最熟練的集合了,但是知其然不知其所以然。關于ArrayList的具體實現,一些基本的都也知道,譬如數組實現,線程不安全等等,但是更加具體的就很少去了解了,例如:...

    wupengyu 評論0 收藏0
  • ConcurrentModificationException,iterator迭代問題[源碼分析]

    摘要:單線程的迭代過程中刪除集合元素以上代碼會出現如下異常從后往前看第行代碼我們在執行代碼行時調用了這個是調用返回的對象這個對象的方法如下圖方法首先它會調用這個方法這個方法很簡單就是比較這兩個值是不是相等不相等就拋出異常如下圖這兩個值為什么會不相 單線程的Iterator迭代過程中刪除集合元素 public class TestIterator { public static voi...

    zhoutk 評論0 收藏0
  • ConcurrentModificationException,iterator迭代問題[源碼分析]

    摘要:單線程的迭代過程中刪除集合元素以上代碼會出現如下異常從后往前看第行代碼我們在執行代碼行時調用了這個是調用返回的對象這個對象的方法如下圖方法首先它會調用這個方法這個方法很簡單就是比較這兩個值是不是相等不相等就拋出異常如下圖這兩個值為什么會不相 單線程的Iterator迭代過程中刪除集合元素 public class TestIterator { public static voi...

    aaron 評論0 收藏0

發表評論

0條評論

DevTalking

|高級講師

TA的文章

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