国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 對Java ArrayList的自動擴容機制示例講解

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

2021-06-03 13:52ZERONELOVE Java教程

今天小編就為大家分享一篇對Java ArrayList的自動擴容機制示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

注意:

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

實驗環境:jdk1.8

擴容機制:

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

arraylist:本質通過內部維護的數組對象進行數據存儲

①:分析arraylist的add(e)方法

?
1
2
3
4
5
public boolean add(e e) {
 ensurecapacityinternal(size + 1); // increments modcount!!
 elementdata[size++] = e;
 return true;
}

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

elementdata:arraylist真正用于存儲元素的數組

②:分析ensurecapacityinternal方法

?
1
2
3
4
5
6
private void ensurecapacityinternal(int mincapacity) {
  if (elementdata == defaultcapacity_empty_elementdata) {
   mincapacity = math.max(default_capacity, mincapacity);
  }
  ensureexplicitcapacity(mincapacity);
 }

分析:ensurecapacityinternal判斷arraylist默認的元素存儲數據是否為空,為空則設置最小要求的存儲能力為必要存儲的元素和默認存儲元素個數的兩個數據之間的最大值,然后調用ensureexplicitcapacity方法實現這種最低要求的存儲能力

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

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

③:分析ensureexplicitcapacity方法:

?
1
2
3
4
5
6
7
private void ensureexplicitcapacity(int mincapacity) {
 modcount++;
 
 // overflow-conscious code
 if (mincapacity - elementdata.length > 0)
  grow(mincapacity);
}

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

④:分析grow()方法

?
1
2
3
4
5
6
7
8
9
10
11
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倍

?
1
int newcapacity = oldcapacity + (oldcapacity >> 1);

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

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

?
1
2
3
4
5
6
7
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最大的存儲能力:存儲元素的個數為整型的范圍。

確定arraylist擴容之后最新的可存儲元素個數時,調用

?
1
elementdata = arrays.copyof(elementdata, newcapacity);

實現elementdata數組的擴容,整個流程就是arraylist的自動擴容機制工作流程

擴展:

arraylist的自動擴容機制底層借助于system實現

?
1
2
3
4
public static native void arraycopy
(object src, int srcpos,
object dest, int destpos,
int length);

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

arraylist含參構造函數:初始化時指定存儲元素的能力:

?
1
2
3
4
5
6
7
8
9
10
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的自動擴容機制示例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/yang1464657625/article/details/59109133

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产一区二区三区在线免费观看 | 欧美精品久久久久久久久老牛影院 | 玖玖玖视频 | 国产成年人电影在线观看 | 日韩电影免费在线观看 | 日韩色区| 日韩精品一区二区在线观看 | 亚洲一区二区三区视频 | 玖玖国产 | 亚洲天天在线观看 | 国产一区视频在线 | 91精品久久久久久久久久久久久久久 | 久久99国产精一区二区三区 | 精品国产精品三级精品av网址 | 日韩成人影院 | 久久精品视频免费观看 | 久久国产精品久久久久久电车 | 久久久久成人精品免费播放动漫 | 成人在线午夜 | 国产一级片 | 日日夜夜狠狠干 | 亚洲视频在线播放 | 一区二区在线免费观看 | 综合久久久久 | 亚洲精品久久久久中文字幕欢迎你 | 亚洲免费观看视频 | 91精品国产91久久久久久吃药 | 91羞羞网站 | 国产3区| 中文字幕自拍偷拍 | 亚洲xxxxx| 中文字幕三区 | 欧美日韩国产一区二区三区不卡 | 不用播放器的免费av | 中文一二区 | 欧美1区2区3区 | 久久免费视频观看 | 91久久精品国产91久久性色tv | 欧美在线亚洲 | 91麻豆精品国产91久久久更新资源速度超快 | 人人人人人你人人人人人 |