日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ArrayList的add(E e)方法与扩容

發布時間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ArrayList的add(E e)方法与扩容 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ArrayList是Java開發中經常用到的集合類,它是List接口的實現類,具有很高的查詢性能,但不是線程安全的。本文主要講述了ArrayList的add(E e)方法及該方法中涉及到的容量擴容技術。

  • 本文大綱

1.ArrayList底層數據結構

2.add(E e)方法流程概覽

3.add(E e)方法與擴容源碼分析

說明:本文對ArrayList的源碼分析是基于JDK8。

  • 正文

1.ArrayList底層數據結構

ArrayList的底層數據結構為一個Object數組,對應到源碼中是:

transient Object[] elementData; // non-private to simplify nested class access

2.add(E e)方法流程概覽

add(E e)方法的大致流程:

? ? ? ? ? ? ? ? ? ? ? ?

3.add(E e)方法與擴容源碼分析

接著再看一下源碼:

public boolean add(E e) {// 確保數組有足夠的空間來存儲對象eensureCapacityInternal(size + 1); // Increments modCount!!// 將對象e存放到數組的末尾elementData[size++] = e;return true; } ensureCapacityInternal方法主要是確保elementData數組有足夠的空間來存儲待添加的元素: // 參數minCapacity是add(E e)方法中調用ensureCapacityInternal方法時傳入的size + 1的值 private void ensureCapacityInternal(int minCapacity) {if (elementData == EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity); }

參數minCapacity是為了存放這個元素elementData數組所需要的最小的大小。比如,現在一個數組中存放了10個元素,再次向該數組存放一個元素時,那么這個minCapacity的值就是size + 1,即10 + 1 = 11。

private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)      // 存放新元素所需的最小容量大于elementData數組的長度 grow(minCapacity); }

如果存放新元素所需的最小容量大于elementData數組的長度,即當前數組的容量不足,不能再存放新的元素,那么將基于elementData數組進行擴容。

private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1); // 計算新數組的容量,新數組的容量為原數組容量的1.5倍數。>>是移位運算符,oldCapacity >> 1表示oldCapacity除以2if (newCapacity - minCapacity < 0) // 針對當創建的ArrayList的容量大小為1時能夠進行擴容(下面將詳細分析)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); // 進行數組拷貝,并將新產生的數組賦值給elementData }

?

?當我們在new ArrayList的時候,如果指定ArrayList的容量大小為1(比如,new ArrayList<>(1)),再進行add(E e)操作,在執行代碼int newCapacity = oldCapacity + (oldCapacity >> 1)時,newCapacity的值為1,newCapacity與oldCapacity的值都為1,這樣其實并沒有進行擴容。if (newCapacity - minCapacity < 0)就是為避免這種情況,當newCapacity(此例中為1)的值小于minCapacity(此例中為2)時,就把minCapacity的值賦給newCapacity。

?

轉載于:https://www.cnblogs.com/pedlar/p/10165630.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的ArrayList的add(E e)方法与扩容的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕人妻一区 | 一区欧美| 久久久久久激情 | 91破处视频| 精品乱子伦一区二区 | 免费国产a | 想要视频在线 | 欧美毛片在线观看 | 国产精品suv一区二区69 | 欧美 亚洲 另类 偷偷 自拍 | 三级在线视频 | 五月婷婷狠狠爱 | 日韩欧美精品一区 | 国产精品波多野结衣 | 日韩欧美中文字幕在线播放 | 国产欧美日韩精品区一区二污污污 | 国产精品综合久久久 | a毛片大片 | 欧美视频在线观看 | 日韩色网 | 末发成年娇小性xxxxx | 国产在线观看一区二区三区 | 深夜激情网站 | 国产精品无码毛片 | 91av毛片| 欧美成人一级视频 | 不卡欧美 | 91麻豆一区二区三区 | 天天狠天天插天天透 | 有码视频在线观看 | 大奶子在线 | 91肉色超薄丝袜脚交一区二区 | 朝桐光av在线一区二区三区 | 丰满人妻熟妇乱偷人无码 | 午夜精品久久久久久久爽 | 毛片视频免费播放 | 国产成人综合欧美精品久久 | 国产精品中文无码 | 久久av网站| av视屏在线| 天天色天天爽 | 日韩三级视频在线播放 | 综合网在线观看 | 4438亚洲 | 天天摸日日摸 | 激情九九 | 午夜在线观看av | 孕妇丨91丨九色 | 伊人亚洲精品 | 无码精品久久久久久久 | 亚洲欧洲日本一区二区三区 | 在线不卡一区二区 | 大香伊人| 国产一区二区在线播放 | 精品一区二区久久久久久久网站 | 打开每日更新在线观看 | 国产三级国产精品国产专区50 | 91精品久久久久久久99蜜桃 | 在线天堂av | 成人激情在线观看 | www免费黄色 | 激情小视频 | 成人欧美日韩 | 99精品毛片| 亚洲污网站 | 性xxxx搡xxxxx搡欧美 | 91一区二区三区在线观看 | 日韩精品一区二区不卡 | 尤物精品 | 日日夜夜精品视频 | 小泽玛利亚在线 | av五月天在线 | 国产精品高潮呻吟AV无码 | 天天看天天爽 | 色婷婷aⅴ一区二区三区 | 超碰成人在线观看 | 91天天射| 国产一区二区视频在线观看 | 自拍偷自拍亚洲精品播放 | 免费观看一区二区三区毛片 | 亚洲一区日韩 | 女色综合 | 国产精品一区二区三区四区 | av导航网站 | 国产三级按摩推拿按摩 | caoporen在线 | 玉米地疯狂的吸允她的奶视频 | 草草在线观看 | 国产日产欧美一区二区 | 色黄网站在线观看 | 影音先锋欧美资源 | 国产成年无码久久久久毛片 | 东北少妇bbbb搡bbb搡 | 男女黄色片 | 四虎影院污 | 秋霞欧美视频 | 图书馆的女友在线观看 | 久久亚洲一区二区 | 海角社区在线 |