欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

對Java ArrayList的自動擴容機制示例講解

 更新時間:2018年10月13日 09:06:31   作者:ZERONELOVE  
今天小編就為大家分享一篇對Java ArrayList的自動擴容機制示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

注意:

不同的JDK版本的擴容機制可能有差異

實驗環(huán)境:JDK1.8

擴容機制:

當向ArrayList中添加元素的時候,ArrayList如果要滿足新元素的存儲超過ArrayList存儲新元素前的存儲能力,ArrayList會增強自身的存儲能力,已達到存儲新元素的要求

ArrayList:本質通過內部維護的數(shù)組對象進行數(shù)據存儲

①:分析ArrayList的add(E)方法

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

分析:add方法首先通過ensureCapacityInternal()方法確保當前ArrayList維護的數(shù)組具有存儲新元素的能力,經過處理之后將元素存儲在數(shù)組elementData的尾部

elementData:ArrayList真正用于存儲元素的數(shù)組

②:分析ensureCapacityInternal方法

private void ensureCapacityInternal(int minCapacity) {
  if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
   minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
  }
  ensureExplicitCapacity(minCapacity);
 }

分析:ensureCapacityInternal判斷ArrayList默認的元素存儲數(shù)據是否為空,為空則設置最小要求的存儲能力為必要存儲的元素和默認存儲元素個數(shù)的兩個數(shù)據之間的最大值,然后調用ensureExplicitCapacity方法實現(xiàn)這種最低要求的存儲能力

注意:ArrayList的存儲空間并不是需要一個創(chuàng)建一個,而是分階段性的創(chuàng)建,一般會預留存儲空間。

例如,如果ArrayList需要存儲10個元素,恰好ArrayList只能存儲6個元素,剩余4個元素無法存儲,ArrayList可能會一次性擴展10個元素,這種ArrayList就有20個元素的存儲能力,在存儲能力范圍內,下次再存放元素,就不需要再次擴容

③:分析ensureExplicitCapacity方法:

 private void ensureExplicitCapacity(int minCapacity) {
  modCount++;

  // overflow-conscious code
  if (minCapacity - elementData.length > 0)
   grow(minCapacity);
 }

分析:如果最低要求的存儲能力>ArrayList已有的存儲能力,這就表示ArrayList的存儲能力不足,因此需要調用 grow();方法進行擴容

④:分析grow()方法

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

分析:當ArrayList擴容的時候,首先會設置新的存儲能力為原來的1.5倍

 int newCapacity = oldCapacity + (oldCapacity >> 1);

如果擴容之后還是不能滿足要求則MAX_ARRAY_SIZE比較,求取最大值,

如果MAX_ARRAY_SIZE大小的能力還是不能滿足則通過hugeCapacity()方法獲取ArrayList能允許的最大值:

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

從hugeCapacity方法看出,ArrayList最大的存儲能力:存儲元素的個數(shù)為整型的范圍。

確定ArrayList擴容之后最新的可存儲元素個數(shù)時,調用

elementData = Arrays.copyOf(elementData, newCapacity); 

實現(xiàn)elementData數(shù)組的擴容,整個流程就是ArrayList的自動擴容機制工作流程

擴展:

ArrayList的自動擴容機制底層借助于System實現(xiàn)

 public static native void arraycopy
 (Object src, int srcPos,
 Object dest, int destPos,
 int length);

arraycopy標識為native意味JDK的本地庫,不可避免的會進行IO操作,如果頻繁的對ArrayList進行擴容,毫不疑問會降低ArrayList的使用性能,因此當我們確定添加元素的個數(shù)的時候,我們可以事先知道并指定ArrayList的可存儲元素的個數(shù),這樣當我們向ArrayList中加入元素的時候,就可以避免ArrayList的自動擴容,從而提高ArrayList的性能

ArrayList含參構造函數(shù):初始化時指定存儲元素的能力:

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

以上這篇對Java ArrayList的自動擴容機制示例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • springboot+kafka中@KafkaListener動態(tài)指定多個topic問題

    springboot+kafka中@KafkaListener動態(tài)指定多個topic問題

    這篇文章主要介紹了springboot+kafka中@KafkaListener動態(tài)指定多個topic問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 基于spring如何實現(xiàn)事件驅動實例代碼

    基于spring如何實現(xiàn)事件驅動實例代碼

    這篇文章主要給大家介紹了關于基于spring如何實現(xiàn)事件驅動的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

    SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

    這篇文章主要介紹了SpringBoot與SpringMVC中參數(shù)傳遞的原理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • java網絡編程中向指定URL發(fā)送GET POST請求示例

    java網絡編程中向指定URL發(fā)送GET POST請求示例

    這篇文章主要介紹了java向指定URL發(fā)送GET POST請求示例,學習JAVA網絡編程一定會用到的,大家參考使用吧
    2013-11-11
  • C# TreeNode案例詳解

    C# TreeNode案例詳解

    這篇文章主要介紹了C# TreeNode案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • Java中的動態(tài)代理和靜態(tài)代理詳細解析

    Java中的動態(tài)代理和靜態(tài)代理詳細解析

    這篇文章主要介紹了Java中的動態(tài)代理和靜態(tài)代理詳細解析,Java中的代理可以幫助被代理者完成一些前期的準備工作和后期的善后工作,但是核心的業(yè)務邏輯仍然是由被代理者完成,需要的朋友可以參考下
    2023-11-11
  • Java設計模式之觀察者模式

    Java設計模式之觀察者模式

    這篇文章主要介紹了Java設計模式之觀察者模式,觀察者模式,是一種行為性模型,又叫發(fā)布-訂閱模式,他定義對象之間一種一對多的依賴關系,使得當一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并自動更新,需要的朋友可以參考下
    2023-11-11
  • springboot掃描引入jar包的service等組件方式

    springboot掃描引入jar包的service等組件方式

    這篇文章主要介紹了springboot掃描引入jar包的service等組件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java語言實現(xiàn)簡單FTP軟件 FTP協(xié)議分析(1)

    Java語言實現(xiàn)簡單FTP軟件 FTP協(xié)議分析(1)

    這篇文章主要介紹了Java語言實現(xiàn)簡單FTP軟件的第一篇,針對FTP協(xié)議進行分析,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Springboot整合Druid實現(xiàn)對訪問的監(jiān)控方式

    Springboot整合Druid實現(xiàn)對訪問的監(jiān)控方式

    這篇文章主要介紹了Springboot整合Druid實現(xiàn)對訪問的監(jiān)控方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論