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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

集合-ArrayList

發(fā)布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 集合-ArrayList 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、ArrayList的注意事項:

1)ArrayList可以放任何元素,包括空值,可以加入多個空值。
2)ArrayList是由數(shù)組來實現(xiàn)數(shù)據(jù)存儲的
3)ArrayList基本等同于Vector,除lArrayList是線程不安全(執(zhí)行效率高),在多線程情況下,不建議使用ArrayList
沒有synchronized進行修飾

二、ArrayList 的底層操作機制源碼分析(重點,難點)

  • ArrayList 中維護了一個 Object類型的數(shù)組 elementData。 transient Object[]
    elementData; // transient 標識瞬間,短暫的,表示該屬性不會被序列化
  • 當創(chuàng)建ArrayList對象時,如果使用的是無參構(gòu)造器,則初始elementData
    容量為0,第一次添加,則擴容elementData為10,如需再次擴容,則擴容elementData為1.5倍。
  • 如果使用的是指定大小的構(gòu)造器,則初始elementData容量為指定大小,如果需要擴容,則直接擴容elementData為1.5倍。
// 關閉警告 @SuppressWarnings({"all"}) public class ArrayListSource {public static void main(String[] args) {// 源碼分析 // 使用無參構(gòu)造器創(chuàng)建ArrayList對象ArrayList list = new ArrayList(); // 使用for循環(huán)給list集合添加 1-10 數(shù)據(jù)for (int i = 0; i <= 10; i++) {list.add(i);} // 使用for循環(huán)給list集合添加 11-15 數(shù)據(jù)for (int i = 11; i<=15;i++){list.add(i);}list.add(100);list.add(200);list.add(null);for (Object o : list) {System.out.println(o);}} }
  • 在 ArrayList list = new ArrayList(); 處添加斷點
  • debug – step Into 到 ArrayList.java的ArrarList()構(gòu)造方法
  • 使用無參構(gòu)造器
/*** Constructs an empty list with an initial capacity of ten.*/public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}
  • 查詢DEFAULTCAPACITY_EMPTY_ELEMENTDATA可發(fā)現(xiàn) 默認為空數(shù)組
/*** Shared empty array instance used for default sized empty instances. We* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when* first element is added.*/private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

然后執(zhí)行 list 的boolean add(E e)方法
先確定是否要擴容,
然后再執(zhí)行 賦值

/*** Appends the specified element to the end of this list.** @param e element to be appended to this list* @return <tt>true</tt> (as specified by {@link Collection#add})*/public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!elementData[size++] = e;return true;}

在boolean add(E e)方法中,先執(zhí)行ensureCapacityInternal(size + 1)方法確定是否要擴容,然后再執(zhí)行賦值。

private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));}

在calculateCapacity()方法中 先確定elementData是否為空數(shù)組,如果為空數(shù)組,返回DEFAULT_CAPACITY(默認為10) 和 minCapacity(第一次為1) 中的最大值,

private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;}

在ensureExplicitCapacity(int minCapacity)方法中確定是否真的擴容

modCount++ :記錄集合修改次數(shù)
如果elementData大小不夠,則調(diào)用grow()進行擴容

minCapacity - elementData.length > 0 :如果數(shù)組所需最小容量 - 數(shù)組當前實際大小 大于 0 則執(zhí)行擴容

private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}

grow()方法執(zhí)行擴容

  • 將elementData.length 記錄到 oldCapacity中,第一次值為0 newCapacity = oldCapacity
  • (oldCapacity >> 1); 執(zhí)行擴容,擴容大小為 數(shù)組當前容量+數(shù)組當前大小右移1位(除以2),即擴容1.5倍
  • 因為第一次擴容oldCapacity 為0 所有newCapacity 也為0,執(zhí)行 if (newCapacity -
    minCapacity < 0) newCapacity = minCapacity; 此時newCapacity 為
    10,所以第一次擴容大小為 10
  • elementData = Arrays.copyOf(elementData, newCapacity);
    Arrays.copyOf()方法可保留原先數(shù)據(jù)擴容 執(zhí)行Arrays.copyOf()方法進行擴容,第一次執(zhí)行完elementData
    中有10個空數(shù)據(jù)
/*** Increases the capacity to ensure that it can hold at least the* number of elements specified by the minimum capacity argument.** @param minCapacity the desired minimum capacity*/private void grow(int minCapacity) {// overflow-conscious codeint 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);}

擴容完成后,繼續(xù)執(zhí)行add()方法,將數(shù)據(jù)添加到elementData數(shù)組中

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

總結(jié)

以上是生活随笔為你收集整理的集合-ArrayList的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91看片黄色 | 欧美激情免费 | 亚洲高清视频在线播放 | 久久久久久久久福利 | 午夜在线一区二区 | 亚洲手机看片 | 天天舔天天爽 | 日日狠狠久久偷偷四色综合免费 | 中文字幕一本 | 亚洲视频一区二区 | 男人天堂成人网 | 午夜免费福利在线观看 | 高潮毛片又色又爽免费 | 成人动漫视频在线观看 | 国产男男网站 | 色综合久久久久综合体桃花网 | 最新国产视频 | 国产极品福利 | 夜夜精品视频 | 无码人妻av一区二区三区波多野 | 五月天婷婷激情 | 日韩一区二区a片免费观看 伊人网综合在线 | 樱桃av | 久久久国产精品成人免费 | 亚洲视频在线观看免费视频 | 欧美精品一区二区三区久久 | 国产在线毛片 | 跪求黄色网址 | 国产精品网站免费 | 橹图极品美女无圣光 | 国产毛片久久 | 欧美综合激情 | 青青草97国产精品麻豆 | 欧美粗大猛烈 | 欧美老女人性生活视频 | 国产精品久久久久久一区 | 国产免费的av | 一区二区三区国产精品 | 少妇被躁爽到高潮无码人狍大战 | 波多野42部无码喷潮在线 | 久久只有精品 | 久久黄色影院 | 日日射天天干 | 亚洲九九色 | 东京热一区二区三区四区 | av影视网 | 国产成人av一区二区 | 国产成人宗合 | 亚洲图片自拍偷拍区 | 一本大道伊人av久久综合 | 波多野结衣调教 | 中国黄色免费网站 | 国产综合久久久久久鬼色 | 欧美三日本三级少妇三级99观看视频 | 黄色网址国产 | 人人cao| 伊人成长网 | 婷婷六月激情 | 操操干干 | 欧美亚洲综合另类 | 99热免费在线观看 | 4388成人网 | av日韩高清| 在哪里可以看黄色片 | 国产精品破处 | 日韩欧美一区二区三区在线 | 国产精品一区免费 | 少妇人妻偷人精品无码视频 | 免费黄网站在线看 | 好av| 在线观看黄色av | 日韩国产欧美一区二区 | 成人网在线播放 | brazzers欧美极品少妇 | 天天躁日日躁狠狠躁伊人 | 肉番在线观看 | 三区四区 | 亚洲男人第一天堂 | 欧美在线资源 | 欧美日韩国产大片 | 成人免费在线视频观看 | 日xxxx| 影音先锋在线看片资源 | a天堂视频 | 欧美成人精品一区二区三区 | 日本欧美在线视频 | 动漫av网站 | 久久精品国产精品亚洲色婷婷 | 黄色高潮视频 | 色99在线| 老子影院午夜精品无码 | 成人在线看片 | 国产精品视频导航 | 91久久精品无码一区二区 | 欧美精品啪啪 | 99综合在线 | 国产a网| 国产精品入口麻豆九色 | 美女喷液视频 |