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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

集合-ArrayList

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

一、ArrayList的注意事項:

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

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

  • ArrayList 中維護了一個 Object類型的數組 elementData。 transient Object[]
    elementData; // transient 標識瞬間,短暫的,表示該屬性不會被序列化
  • 當創建ArrayList對象時,如果使用的是無參構造器,則初始elementData
    容量為0,第一次添加,則擴容elementData為10,如需再次擴容,則擴容elementData為1.5倍。
  • 如果使用的是指定大小的構造器,則初始elementData容量為指定大小,如果需要擴容,則直接擴容elementData為1.5倍。
// 關閉警告 @SuppressWarnings({"all"}) public class ArrayListSource {public static void main(String[] args) {// 源碼分析 // 使用無參構造器創建ArrayList對象ArrayList list = new ArrayList(); // 使用for循環給list集合添加 1-10 數據for (int i = 0; i <= 10; i++) {list.add(i);} // 使用for循環給list集合添加 11-15 數據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()構造方法
  • 使用無參構造器
/*** Constructs an empty list with an initial capacity of ten.*/public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}
  • 查詢DEFAULTCAPACITY_EMPTY_ELEMENTDATA可發現 默認為空數組
/*** 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 = {};

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

/*** 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)方法中,先執行ensureCapacityInternal(size + 1)方法確定是否要擴容,然后再執行賦值。

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

在calculateCapacity()方法中 先確定elementData是否為空數組,如果為空數組,返回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++ :記錄集合修改次數
如果elementData大小不夠,則調用grow()進行擴容

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

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

grow()方法執行擴容

  • 將elementData.length 記錄到 oldCapacity中,第一次值為0 newCapacity = oldCapacity
  • (oldCapacity >> 1); 執行擴容,擴容大小為 數組當前容量+數組當前大小右移1位(除以2),即擴容1.5倍
  • 因為第一次擴容oldCapacity 為0 所有newCapacity 也為0,執行 if (newCapacity -
    minCapacity < 0) newCapacity = minCapacity; 此時newCapacity 為
    10,所以第一次擴容大小為 10
  • elementData = Arrays.copyOf(elementData, newCapacity);
    Arrays.copyOf()方法可保留原先數據擴容 執行Arrays.copyOf()方法進行擴容,第一次執行完elementData
    中有10個空數據
/*** 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);}

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

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

總結

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

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