国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

ArrayList 源碼淺析

網絡
ArrayList作為我們開發中最常用的集合,作為極高頻次使用的類,我們不妨閱讀源碼一談究竟。

前言

ArrayList作為我們開發中最常用的集合,作為極高頻次使用的類,我們不妨閱讀源碼一談究竟。

介紹

ArrayList繼承關系如下

AaaryList主要實現了List接口,同時標記為可以序列化Serializable、可復制CloneAble、支持隨機訪問RandomAccess。

幾個重要的成員變量

  1. /**     * 默認容量     */    private static final int DEFAULT_CAPACITY = 10;    /**     * 用于空實例的共享空數組實例。     */    private static final Object[] EMPTY_ELEMENTDATA = {};    /**     * 用于默認大小的空實例的共享空數組實例。我們將其與空元素數據區分開來,以了解添加第一個元素時要膨脹多少。     */    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};    /**     * 存儲ArrayList元素的數組緩沖區。ArrayList的容量是此數組緩沖區的長度。     */    transient Object[] elementData; // non-private to simplify nested class access    /**     * ArrayList的大小(它包含的元素數)。     */    private int size; 

數據結構

ArrayList底層就是一個數組,數組會隨著數據的增長而擴容,數組的擴容就是建立一個新的容量大的數組,然后把舊數組上面的數據復制進新數組。關于擴容,后面會詳細講解。

因為是數組,所以支持隨機訪問,且有序。

常用方法

ArrayList()無參構造方法

  1. public ArrayList() {        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;    } 

初始化數組為一個空數組。與空元素數據區分開來,以了解添加第一個元素時要膨脹多少。

add(E e) 添加元素

將指定的元素追加到此列表的末尾

  1. public boolean add(E e) {        ensureCapacityInternal(size + 1);  // Increments modCount!!        elementData[size++] = e;        return true;    } 

  1. private static int calculateCapacity(Object[] elementData, int minCapacity) {        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {            return Math.max(DEFAULT_CAPACITY, minCapacity);        }        return minCapacity;    }    private void ensureCapacityInternal(int minCapacity) {        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));    }    private void ensureExplicitCapacity(int minCapacity) {        modCount++;        // overflow-conscious code        if (minCapacity - elementData.length > 0)            grow(minCapacity);    } 

當添加元素,會先檢查是否超出容量,如果超出,則需要擴容。

當第一次添加元素時,size為默認值0,會計算出一個最小容量minCapacity,如果是無參構造創建的,則會取默認的容量10,

Math.max(DEFAULT_CAPACITY, minCapacity),這里傳入的minCapacity為0,所以獲取更大的10。

如果計算出的最小容量大于原容量minCapacity - elementData.length > 0,則會進行擴容。

  1. 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);    } 

擴容算法是,擴為老容量的1.5倍,如果擴容后的容量仍然小于需要的最小容量minCapacity,則新的容量就取最小容量。

如果擴容后的大小超過最大容量,則會進行下面的操作

  1. private static int hugeCapacity(int minCapacity) {        if (minCapacity < 0// overflow            throw new OutOfMemoryError();        return (minCapacity > MAX_ARRAY_SIZE) ?            Integer.MAX_VALUE :            MAX_ARRAY_SIZE;    } 

計算出擴容后的容量后,進行擴容,也就是,新建一個數組初始化為新容量,然后復制舊元素到新數組。elementData = Arrays.copyOf(elementData, newCapacity);

  1. public static <T> T[] copyOf(T[] original, int newLength) {        return (T[]) copyOf(original, newLength, original.getClass());    } 
  1. public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {        @SuppressWarnings("unchecked")        T[] copy = ((Object)newType == (Object)Object[].class)            ? (T[]) new Object[newLength]            : (T[]) Array.newInstance(newType.getComponentType(), newLength);        System.arraycopy(original, 0, copy, 0,                         Math.min(original.length, newLength));        return copy;    } 

為什么不能在forEach里面修改列表

ArrayList在新增、刪除元素都會執行modCount++

modCount定義在ArrayList的父類AbstractList。

  1. /**     * 此列表在結構上被修改的次數。結構修改是指那些改變列表大小的修改,或者以某種方式干擾列表,使得正在進行的迭代可能產生不正確的結果。 迭代器和列表迭代器方法返回的迭代器和列表迭代器實現使用此字段。如果此字段的值意外更改,迭代器(或列表迭代器)將拋出ConcurrentModificationException以響應下一個、刪除、上一個、設置或添加操作。這提供了快速失效行為,而不是在迭代過程中面對并發修改時的非確定性行為。 子類使用此字段是可選的。如果子類希望提供fail fast迭代器(和列表迭代器),那么它只需在add(int,E)和remove(int)方法(以及它重寫的任何其他方法,這些方法會導致列表的結構修改)中增加該字段。對add(int,E)或remove(int)的單個調用只能向該字段添加一個,否則迭代器(和列表迭代器)將拋出虛假的ConcurrentModificationException。如果實現不希望提供故障快速迭代器,則可以忽略此字段。     */    protected transient int modCount = 0

然后我們來看下forEach的實現。

  1. @Override    public void forEach(Consumer<? super E> action) {        Objects.requireNonNull(action);        final int expectedModCount = modCount;        @SuppressWarnings("unchecked")        final E[] elementData = (E[]) this.elementData;        final int size = this.size;        for (int i=0; modCount == expectedModCount && i < size; i++) {            action.accept(elementData[i]);        }        if (modCount != expectedModCount) {            throw new ConcurrentModificationException();        }    } 

在遍歷前,會暫存modCount值,每次循環都判斷下modCount是否有更改,若更改了,里面跳出循環,隨后拋出異常。

責任編輯:梁菲 來源: 阿里云云棲號
相關推薦

2009-08-14 17:45:52

C# ArrayLis

2022-09-27 18:56:28

ArrayList數組源代碼

2020-12-14 08:03:52

ArrayList面試源碼

2017-02-27 09:03:37

Mesos架構源碼

2021-07-20 10:26:53

源碼底層ArrayList

2011-04-19 15:38:16

MongodbCursor

2009-07-08 14:06:22

ClassLoaderJDK源碼

2011-12-02 13:04:06

Java

2009-07-08 12:53:29

JDK源碼Java.lang.B

2021-05-26 05:22:09

Virtual DOMSnabbdom虛擬DOM

2017-07-17 11:52:54

jQuery源碼分析前端框架類庫

2018-08-20 16:00:23

MySQL并發控制MVCC

2011-03-14 09:33:35

Mono

2009-12-03 17:43:27

Linux服務器

2021-07-29 12:05:18

Vue3Api前端

2009-08-21 17:53:25

C#網絡編程客戶端程序

2023-09-08 13:46:12

ArrayList數據存儲容器

2012-10-29 11:21:35

IBMdw

2009-08-12 18:35:36

C# ArrayLis

2009-08-21 17:39:20

服務器端程序C#網絡編程
點贊
收藏

51CTO技術棧公眾號

色哟哟在线观看一区二区三区| 亚洲妇女屁股眼交7| 国产中文日韩欧美| 69堂免费精品视频在线播放| 91国偷自产一区二区三区成为亚洲经典 | 亚洲免费网站| 91久久综合亚洲鲁鲁五月天| 久久精品亚洲成在人线av网址| 精品国偷自产在线| 免费成人黄色网| 在线视频日韩精品| 精品女同一区二区三区在线观看| 精品亚洲一区二区三区在线播放| 免费电影网站在线视频观看福利| 欧美va在线播放| 丰乳肥臀在线| 精品视频在线观看日韩| 美女露胸视频在线观看| 日韩女优视频免费观看| 大黄网站在线观看| 亚洲色图15p| 欧美电影在线观看网站| 欧美精品性视频| 网友自拍区视频精品| 国产精品男人的天堂| 国产电影一区二区在线观看| 国产欧美一区二区| 黑人一区二区三区四区五区| 国产精品yjizz| 日韩精品久久理论片| 午夜在线视频免费观看| av在线不卡电影| 91热这里只有精品| 亚洲精品日韩综合观看成人91| 在线观看免费毛片| 欧美一区二区在线免费观看| 午夜激情电影在线播放| 日韩中文字幕精品视频| 亚洲一区二区免费在线观看| 国产精品久久久久久av福利软件| 天天揉久久久久亚洲精品| 久久人人九九| 成人免费视频一区| 免费的很黄很污的视频网站| 91久久一区二区| 在线免费av资源| 欧美在线中文字幕| 9久re热视频在线精品| 法国空姐在线观看免费| 国产精品乱子久久久久| 成人av毛片| 日韩亚洲欧美成人| 久久要要av| 一区二区在线高清视频| 国产精品毛片高清在线完整版| 欧美成熟毛茸茸| 亚洲国产毛片完整版| 亚洲第一二区| 7777精品伊久久久大香线蕉语言| 久久成人综合网| 激情校园亚洲图片| 日韩视频在线永久播放| 美国十次综合久久| 国产成人精品一区二区三区福利| 国产成人精品三级| 影音先锋另类| 亚洲人成在线电影| 国产精品久久天天影视| 91免费视频黄| 伊人开心综合网| av在线理伦电影| 国产精品一区二区三| 男人添女荫道口图片| 精品动漫一区二区| 99久久伊人| 国产精品久久精品国产| 99re在线精品| 黄色网址免费在线观看| 91国产视频在线| 精品一区二区影视| 美女毛片在线看| 久久久久久香蕉网| 玖玖国产精品视频| 最新理论片影院| 国产亚洲精品一区二555| 欧美91大片| www.99av| 亚洲欧美在线免费| 中文日韩欧美| 一二三区高清| 九色成人免费视频| 国内精品在线播放| 自拍视频在线免费观看| 91黑丝高跟在线| 国产黑丝在线一区二区三区| 成人jjav| 国产精品老牛影院在线观看| 九一九一国产精品| chinese偷拍一区二区三区| 欧美激情久久久久| 国产黑丝在线一区二区三区| 91xxx在线观看| 国产精品日韩在线| 中文在线资源观看网站视频免费不卡 | 久久综合亚洲社区| 天使萌一区二区三区免费观看| 男人天堂午夜在线| 欧美—级a级欧美特级ar全黄 | 欧美在线一二三区| 色婷婷久久99综合精品jk白丝| 高清精品视频| 国产精品免费观看久久| 亚洲美女性视频| 日韩av在线发布| 欧美jizz18性欧美| 成人av播放| 在线亚洲高清视频| 婷婷六月综合| 亚洲人成电影| 日本中文字幕久久看| 久久久无码精品亚洲日韩按摩| 肉色欧美久久久久久久免费看| 麻豆av一区二区三区| 色屁屁一区二区| 久久久久久久久国产一区| 国产无遮挡在线视频免费观看| 97视频色精品| 国产欧美日韩麻豆91| 日韩成人视屏| 在线观看av网页| 5278欧美一区二区三区| 国产精品热久久久久夜色精品三区| 成人国产精品久久| 亚洲熟妇国产熟妇肥婆| 久久久成人精品| 国产日韩欧美a| 亚洲码欧美码一区二区三区| wwwwxxxx日韩| 欧美亚洲国产精品| 亚洲一区在线播放| 香蕉久久网站| 国产福利电影在线| 日韩av高清在线播放| 日韩美女av在线| 91亚洲永久精品| 欧美午夜寂寞| 一二三区在线| 国产一区免费视频| 精品久久久久久久一区二区蜜臀| 日韩**一区毛片| 成人啊v在线| www.涩涩涩| 91丝袜美腿美女视频网站| 欧美三级在线播放| 精品一区二区三区蜜桃| 日日狠狠久久| 免费一级淫片| 精品毛片久久久久久| 日韩国产一区三区| 欧美激情综合网| 午夜激情久久| www免费视频观看在线| 亚洲天堂第一区| 色综合久久天天综线观看| 一片黄亚洲嫩模| 亚洲影视综合| 日日夜夜亚洲| 视频一区二区三区国产| 一区二区三区四区不卡| 九九热这里只有精品6| 午夜精品成人在线视频| 日韩和欧美的一区| 91精品入口| 第三区美女视频在线| 国产人妻人伦精品| 国产精品久久久久久中文字 | 青青青草网站免费视频在线观看| 欧美精彩一区二区三区| 久久五月天色综合| 天天综合色天天| 日韩1区2区日韩1区2区| 日韩黄色av| 蜜芽在线免费观看| 天天干天天干天天干天天干天天干| 999国产视频| www.xxxx欧美| 色又黄又爽网站www久久| 国产精品香蕉一区二区三区| 视频二区欧美| 丝袜美腿美女被狂躁在线观看| 免费一级特黄毛片| 国产激情一区二区三区在线观看 | 韩日精品一区二区| 美女视频免费观看网站在线| 久久久久高清| 国外成人在线播放| 亚洲国产另类久久精品 | xxxxx中文字幕| 亚洲欧美日韩国产yyy| 国产成人综合精品|