成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ArrayList 的源碼分析(擴(kuò)容機(jī)制-JDK-10)

txgcwm / 1862人閱讀

摘要:的源碼分析擴(kuò)容機(jī)制初始化值默認(rèn)數(shù)組的初始化容量空數(shù)組元素空數(shù)組元素存儲元素的數(shù)組緩沖區(qū)元素個(gè)數(shù)每次數(shù)據(jù)進(jìn)行修改都會(huì)主要是在一些非線程安全的時(shí)候,檢測是否出現(xiàn)混亂構(gòu)造方法默認(rèn)數(shù)組的長度為自己定義初始化的容量添加元素將元素和數(shù)組長度數(shù)

Arraylist的源碼分析(擴(kuò)容機(jī)制-JDK 10)

初始化值

private static final long serialVersionUID = 8683452581122892189L;
默認(rèn)數(shù)組的初始化容量
private static final int DEFAULT_CAPACITY = 10;
空數(shù)組元素
private static final Object[] EMPTY_ELEMENTDATA = {};
空數(shù)組元素
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
存儲ArrayList元素的數(shù)組緩沖區(qū)
transient Object[] elementData; // non-private to simplify nested class access
元素個(gè)數(shù)
private int size;
每次數(shù)據(jù)進(jìn)行修改都會(huì)+1---主要是在一些非線程安全的時(shí)候,檢測是否出現(xiàn)混亂
protected transient int modCount = 0;

構(gòu)造方法
默認(rèn)數(shù)組的長度為10

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

自己定義初始化的容量

public ArrayList(int initialCapacity) {
   if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
   } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
   } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                       initialCapacity);
   }
}

添加元素

public boolean add(E e) {
  modCount++;
  將元素和數(shù)組長度、數(shù)組大小(元素的個(gè)數(shù))傳過去
  add(e, elementData, size);
  return true;
}
private void add(E e, Object[] elementData, int s) {
    如果元素的個(gè)數(shù)和數(shù)組的長度相等,那么就需要對數(shù)組進(jìn)行擴(kuò)容
    if (s == elementData.length)
          elementData = grow();
     如果不是,則將元素添加到最后(元素的最后)
     elementData[s] = e;
     并且元素個(gè)數(shù)+1
     size = s + 1;
}

開始擴(kuò)容—擴(kuò)容的方法

private Object[] grow() {
將可允許的數(shù)組的最小容量傳過去(元素個(gè)數(shù)(size+1)—因?yàn)橐砑右粋€(gè)元素)
return grow(size + 1);

}

private Object[] grow(int minCapacity) {
調(diào)用復(fù)制的方法,在原來元素基礎(chǔ)上增加容量
return elementData = Arrays.copyOf(elementData,
                                   newCapacity(minCapacity));
}

private int newCapacity(int minCapacity) {
// overflow-conscious code
獲取數(shù)組的長度(默認(rèn)的或是自己定義的)
int oldCapacity = elementData.length;
新的容量是原容量的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
新容量比可允許的最小容量小,那么新的容量就是可允許的最小的容量
之所以會(huì)有這個(gè)判斷,是因?yàn)槲覀兛梢宰约憾x初始容量,而不一定是默認(rèn)的容量
if (newCapacity - minCapacity <=  0) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return minCapacity;
}
如果新容量大于數(shù)值的最大值,傳入huge方法,
return (newCapacity - MAX_ARRAY_SIZE <= 0)
    ? newCapacity
    : hugeCapacity(minCapacity);

}
可允許的最小容量是否越界,如果新容量大于數(shù)組默認(rèn)的最大值,賦給它整型的最大值

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

}

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73459.html

相關(guān)文章

  • ArrayList 源碼詳細(xì)分析

    摘要:源碼分析構(gòu)造方法有兩個(gè)構(gòu)造方法,一個(gè)是無參,另一個(gè)需傳入初始容量值。所以我們可以把上面的代碼轉(zhuǎn)換一下,等價(jià)于下面形式這個(gè)時(shí)候,我們再去分析一下的迭代器源碼就能找出原因。原因是刪除元素后,元素計(jì)數(shù)器,而迭代器中的也等于,從而導(dǎo)致返回。 1.概述 ArrayList 是一種變長的集合類,基于定長數(shù)組實(shí)現(xiàn)。ArrayList 允許空值和重復(fù)元素,當(dāng)往 ArrayList 中添加的元素?cái)?shù)量大于...

    W4n9Hu1 評論0 收藏0
  • Java開發(fā) 大廠面試整理

    摘要:用戶態(tài)不能干擾內(nèi)核態(tài)所以指令就有兩種特權(quán)指令和非特權(quán)指令不同的狀態(tài)對應(yīng)不同的指令。非特權(quán)指令所有程序均可直接使用。用戶態(tài)常態(tài)目態(tài)執(zhí)行非特權(quán)指令。 這是我今年從三月份開始,主要的大廠面試經(jīng)過,有些企業(yè)面試的還沒來得及整理,可能有些沒有帶答案就發(fā)出來了,還請各位先思考如果是你怎么回答面試官?這篇文章會(huì)持續(xù)更新,請各位持續(xù)關(guān)注,希望對你有所幫助! 面試清單 平安產(chǎn)險(xiǎn) 飛豬 上汽大通 浩鯨科...

    Scorpion 評論0 收藏0
  • Java 常用List集合使用場景分析

    摘要:常用集合使用場景分析過年前的最后一篇,本章通過介紹,,,底層實(shí)現(xiàn)原理和四個(gè)集合的區(qū)別。和都是線程安全的,不同的是前者使用類,后者使用關(guān)鍵字。面試官會(huì)認(rèn)為你是一個(gè)基礎(chǔ)扎實(shí),內(nèi)功深厚的人才到這里常用集合使用場景分析就結(jié)束了。 Java 常用List集合使用場景分析 過年前的最后一篇,本章通過介紹ArrayList,LinkedList,Vector,CopyOnWriteArrayList...

    godruoyi 評論0 收藏0
  • 【面試必備】透過源碼角度一步一步帶你分析 ArrayList 擴(kuò)容機(jī)制

    摘要:當(dāng)真正對數(shù)組進(jìn)行添加元素操作時(shí),才真正分配容量。下面在我們分析擴(kuò)容時(shí)會(huì)降到這一點(diǎn)內(nèi)容二一步一步分析擴(kuò)容機(jī)制這里以無參構(gòu)造函數(shù)創(chuàng)建的為例分析先來看方法將指定的元素追加到此列表的末尾。 該文已加入開源文檔:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識)。地址:https://github.com/Snailclimb... 一 先從 ArrayList 的構(gòu)造函數(shù)...

    jerry 評論0 收藏0
  • Week 2 - Java 容器 - 詳細(xì)剖析 List 之 ArrayList, Vector,

    摘要:底層使用的是雙向鏈表數(shù)據(jù)結(jié)構(gòu)之前為循環(huán)鏈表,取消了循環(huán)。快速隨機(jī)訪問就是通過元素的序號快速獲取元素對象對應(yīng)于方法。而接口就是用來標(biāo)識該類支持快速隨機(jī)訪問。僅僅是起標(biāo)識作用。,中文名為雙端隊(duì)列。不同的是,是線程安全的,內(nèi)部使用了進(jìn)行同步。 前言 學(xué)習(xí)情況記錄 時(shí)間:week 2 SMART子目標(biāo) :Java 容器 記錄在學(xué)習(xí)Java容器 知識點(diǎn)中,關(guān)于List的需要重點(diǎn)記錄的知識點(diǎn)。...

    MartinDai 評論0 收藏0

發(fā)表評論

0條評論

txgcwm

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<