成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

在java中ArrayList集合底層的擴容原理

瀏覽:10日期:2022-08-14 14:16:15
第一章 前言概述第01節 概述

底層說明

ArrayList是List的實現類,它的底層是用Object數組存儲,線程不安全

后期應用

適合用于頻繁的查詢工作,因為底層是數組,可以快速通過數組下標進行查找

第02節 區別區別方向 ArrayList集合 LinkedList集合 線程安全 不安全 不安全 底層原理 Object類型數組 雙向鏈表 隨機訪問 支持(實現 RandomAccess接口) 不支持 內存占用 ArrayList 浪費空間, 底層是數組,末尾預留一部分容量空間 LinkedList占用空間比ArrayList多,存在頭尾地址值占用空間

小結

ArrayList 集合的特點:

1. 線程不安全

2. 底層數據結構是數組(查詢快,增刪慢,支持快速隨機訪問)

3. 內存占用會存在部分浪費,末尾會預留一部分容量空間

第二章 核心代碼第01節 成員變量

代碼

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ /** * 默認初始容量大小, 默認初始化容量為10 */private static final int DEFAULT_CAPACITY = 10;/** * 空數組。當集合內容置空的時候,底層使用空數組標記 */private static final Object[] EMPTY_ELEMENTDATA = {};/*** 用于無參數構造方法,創建對象的時候,使用這個數組定義。* 相比上面的數組 EMPTY_ELEMENTDATA 可以進行區分,知道在添加元素的過程當中,容量增加多少*/private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};/** * 保存ArrayList數據的數組,這個數組會不斷的改變,前面沒有被 final 修飾表示地址值會發生的變化 */transient Object[] elementData; // non-private to simplify nested class access/** * ArrayList 所包含的元素個數,也就是在 ArrayList 集合底層,通過 size()方法,獲取到的元素個數 */private int size; }

補充

1. ArrayList 集合底層存在6個成員變量還有一個 private static final long serialVersionUID = 8683452581122892189L; 序列化使用, 目前針對于當前的操作過程當中, 暫時不會使用得到。2. ArrayList 集合當中核心的兩個成員變量A. 底層維護數組 transient Object[] elementData;B. 存儲的元素個數private int size; 第02節 構造方法

代碼

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ /** * 構造一個初始長度為0的空數組。 */ public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } /** * 在構造方法當中,傳遞一個參數集合c,將集合 c 轉換成為新的列表 * elementData 當中的數據,就是新集合存放的數據 * c.toArray 就是將原始集合的數據取出 * 如果取出的集合長度不為零的情況下,則復制 參數集合c 到 elementData 當中 * 如果取出的集合長度為零的情況下,則賦值為空數組 EMPTY_ELEMENTDATA */ public ArrayList(Collection<? extends E> c) {elementData = c.toArray();if ((size = elementData.length) != 0) { if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);} else { this.elementData = EMPTY_ELEMENTDATA;} } /** * 指定參數的長度大小 * 如果初始化的長度大于0,則返回新的數組 * 如果初始化的長度等于0,則返回默認的空數組作為集合 this.elementData = EMPTY_ELEMENTDATA; * 如果初始化的長度小于0,則出現非法參數異常 */ 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集合底層的擴容原理

補充(二)帶參構造創建對象,帶有int類型參數

在java中ArrayList集合底層的擴容原理

補充(三)帶參構造創建對象,帶有 集合類型參數

在java中ArrayList集合底層的擴容原理

第三章 擴容操作第01節 擴容代碼

核心方法介紹

來自于 ArrayList 集合當中的方法:1. public boolean add(E e){ ... }2. private void add(E e, Object[] elementData, int s){ .... }3. private Object[] grow()4. private Object[] grow(int minCapacity)來自于其他類當中的功能1. Arrays.copyOf(elementData, newCapacity); 表示來自于 數組工具類 Arrays 當中的 copyOf() 底層使用的是 System.arraycopy() 方法2. Math.max(DEFAULT_CAPACITY, minCapacity) 表示來自于 數學工具類 Math 當中的 max() 方法,比較兩個數據最大值,取較大者,返回

核心代碼解釋

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ /** * 將指定的元素添加到此集合的末尾位置 * * modCount 是來自于父類的 AbstractList 當中的成員變量 * add(e, elementData, size) 調用自己下面的重載方法 * return true 表示當前的方法,一定可以添加成功,因為List系列的集合添加數據都是允許成功的 true 如果是Set此方法返回false */ public boolean add(E e) {modCount++;add(e, elementData, size);return true; }/** * 這個方法是私有方法,僅僅自己可以使用。不允許外界訪問得到。便于上面的 add() 方法重載調用的 * 參數1: 表示需要添加的元素數據 E e * 參數2: 表示成員變量當中, 需要維護管理的底層數組 Object[] elementData * 參數3: 表示成員變量當中, size 容器 elementData 當中存放的真實有效的數據個數 * 方法里面的邏輯: 當size已經等于了內部容器 elementData 的最大長度,則準備進行擴容的操作,擴容使用 grow() 方法 * 無論上面是否進行了擴容的操作,這里都需要將添加的元素賦值到數組當中,也就是 elementData[s] = e; * 并且將當前成員變量的 size 在原始數據的基礎上面,增加1,表示添加了新的元素之后,長度變化了,增加了1 */ private void add(E e, Object[] elementData, int s) {if (s == elementData.length) elementData = grow();elementData[s] = e;size = s + 1; }/** * 這個方法是私有方法,僅僅自己可以使用。不允許外界訪問得到。便于上面的 add() 方法調用的 * 方法的內部調用了 ArrayList 當中自己重載的方法 grow(size + 1) 同時傳入了參數。 * 這里參數的含義,表示的是 集合當中總長度 size + 1 表示在原始size基礎上增加1 * 方法的返回值是一個新的數組,也就是擴容之后的數組 */private Object[] grow() {return grow(size + 1); } /** * 這個方法是私有方法,僅僅自己可以使用。不允許外界訪問得到。便于上面的 grow() 方法調用的 * 這里的參數 minCapacity ,就是上面傳入的參數 size + 1,也就是說最小容量 minCapacity = size + 1 * 方法體當中的執行邏輯: * 1. 獲取到了底層維護數組的長度 int oldCapacity = elementData.length; 這里就是舊容量 oldCapacity * 2. 判斷舊容量 oldCapacity 是否小于0,也就是 else 的邏輯, *如果滿足 if 當中的邏輯, 則表示 舊數組當中存在數據,并且 舊數組并不是 默認容量的空數組地址值 *說明: 擴容過的就不會是之前默認 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的地址值 *在這種情況下,就會得到 1.5被的數組長度整數,傳遞給 Arrays.copyOf()方法進行擴容,得到新數組返回 * 如果滿足 else 當中的邏輯,則返回 DEFAULT_CAPACITY 和 minCapacity 較大值。 * 說明: DEFAULT_CAPACITY 值表示的是成員變量,默認為 10 *說明: minCapacity 在低于10的時候,表示的會是擴容添加的長度1,2,3..9.10.11.. */ private Object[] grow(int minCapacity) {int oldCapacity = elementData.length;if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { int newCapacity = ArraysSupport.newLength(oldCapacity, minCapacity - oldCapacity, /* minimum growth */ oldCapacity >> 1 /* preferred growth */); return elementData = Arrays.copyOf(elementData, newCapacity);} else { return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];} }}

到此這篇關于在java中ArrayList集合底層的擴容原理的文章就介紹到這了,更多相關ArrayList集合擴容原理內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日韩一区在线看| 欧美一区二区三区啪啪| 欧美一区二区三区四区高清| 同产精品九九九| 国产精品毛片va一区二区三区| 中文欧美字幕免费| 99re在线视频这里只有精品| 欧美mv日韩mv亚洲| 大白屁股一区二区视频| 欧美日韩高清影院| 久久99精品国产91久久来源| 欧美在线你懂得| 蜜臀a∨国产成人精品| 在线免费观看日本一区| 日韩国产欧美一区二区三区| 色素色在线综合| 美女免费视频一区| 欧洲激情一区二区| 久久成人免费电影| 91精品久久久久久蜜臀| 国产成人精品亚洲日本在线桃色| 91精品国产免费| 国产v日产∨综合v精品视频| 8v天堂国产在线一区二区| 看电视剧不卡顿的网站| 一本大道久久a久久精二百| 午夜视频久久久久久| 色播五月激情综合网| 久久99精品久久久久久久久久久久| 欧美日韩国产大片| 成人性视频免费网站| 久久精品一区二区| 国产精品a级| 自拍偷拍国产亚洲| 国产精品免费看| 欧美aaaaa成人免费观看视频| 欧美亚洲国产怡红院影院| 另类欧美日韩国产在线| 在线不卡免费av| 成人黄色片在线观看| 国产片一区二区| 最近看过的日韩成人| 亚洲一级在线观看| 欧美午夜不卡在线观看免费| 国产成人免费9x9x人网站视频| 久久伊人蜜桃av一区二区| 国产中文一区| 亚洲高清三级视频| 欧美日韩在线不卡| 99久久婷婷国产精品综合| 综合网在线视频| 色av综合在线| 成人午夜免费视频| 国产精品久久精品日日| 国产日韩欧美一区二区| 日韩成人午夜精品| 91精品国产入口| 欧美午夜欧美| 日韩制服丝袜先锋影音| 91精品国产免费| 国产一区自拍视频| 午夜激情一区二区三区| 欧美一区二区三区婷婷月色 | 国产一区二区视频在线| 久久婷婷国产综合精品青草| 伊人蜜桃色噜噜激情综合| 天天av天天翘天天综合网色鬼国产| 欧美日本在线观看| 色综合天天性综合| 午夜久久久影院| 精品久久人人做人人爰| 国产欧美一区二区三区另类精品| 国产在线国偷精品免费看| 国产精品天天看| 色欧美乱欧美15图片| 99久久精品免费| 一区二区三区电影在线播| 欧美在线free| 欧美日韩成人一区二区三区| 日韩精品1区2区3区| www亚洲一区| 先锋影音一区二区三区| 国产激情视频一区二区在线观看 | 日韩国产欧美三级| 精品国产污网站| 亚洲欧美视频一区二区三区| 丁香婷婷综合色啪| 一片黄亚洲嫩模| 精品少妇一区二区三区在线播放 | 欧美成人一区二区| 免费亚洲一区| 色综合一区二区| 日韩av一级片| 中文字幕 久热精品 视频在线| 在线观看不卡一区| 欧美日韩亚洲三区| 精品亚洲免费视频| 亚洲免费在线观看视频| 欧美一级片在线| 亚洲尤物影院| 91蜜桃网址入口| 蜜桃av噜噜一区二区三区小说| 欧美国产丝袜视频| 欧美伦理影视网| 亚洲精品一二| thepron国产精品| 日日夜夜免费精品视频| 国产精品天美传媒沈樵| 91精品国产欧美一区二区| 亚洲自啪免费| 91日韩精品一区| 久久国产精品一区二区| 亚洲日本韩国一区| 久久久久久久久久电影| 欧美日韩国产一级| 国产精品毛片在线看| 91网址在线看| 久久99国内精品| 亚洲国产精品久久久久秋霞影院| 久久精品亚洲一区二区三区浴池| 欧美在线高清视频| 一区二区三区四区国产| 91免费看`日韩一区二区| 狠狠色狠狠色合久久伊人| 一区二区三区高清| 国产欧美视频一区二区| 91精品国产福利| 欧美在线999| 久久av最新网址| 91蝌蚪porny九色| 成人晚上爱看视频| 秋霞电影网一区二区| 亚洲欧美aⅴ...| 欧美极品aⅴ影院| 国产69精品久久777的优势| 麻豆91小视频| 亚洲成人av电影在线| 日韩美女久久久| 国产女主播视频一区二区| 欧美一区二区三区免费在线看| 一本色道综合亚洲| 中文精品视频| 亚洲人成人一区二区三区| 欧美日韩一区二区高清| 暴力调教一区二区三区| 国产一区视频导航| 久久国产夜色精品鲁鲁99| 日韩成人一区二区| 午夜视频在线观看一区二区| 玉米视频成人免费看| 国产精品久久久久毛片软件| 久久久久久亚洲综合| 精品国产乱码久久久久久老虎| 欧美人妖巨大在线| 欧美色男人天堂| 色婷婷久久久亚洲一区二区三区| 国产精品综合| 亚洲精品孕妇| 亚洲国产一区二区精品专区| 欧美日韩国产精品一卡| 亚洲欧美综合国产精品一区| 99riav一区二区三区| 91视频一区二区三区| 欧美成人综合一区| 黑人巨大精品欧美一区二区小视频| 午夜精品一区二区三区四区| 欧美日韩一区二区国产| 欧美片网站免费| 欧美成人日本| 国产精品久久7| 欧美日韩一区自拍| 国产精品a级| 91久久久久| 国产精品一二| 美女精品网站| 91国产丝袜在线播放| 欧美亚洲尤物久久| 欧美乱熟臀69xxxxxx| 91精品国产综合久久福利| 日韩一区二区精品| 久久噜噜亚洲综合| 国产精品久久二区二区| 亚洲黄色小视频| 午夜欧美视频在线观看| 美女视频黄 久久| 狠狠色狠狠色综合| 国产**成人网毛片九色| 91免费观看在线| 伊人精品成人久久综合软件| 在线综合亚洲| 久久一区中文字幕| 欧美日韩国产免费一区二区| 欧美一区二区性放荡片| 久久免费电影网| 亚洲日本在线a| 日韩av中文在线观看| 国产成人av一区二区三区在线观看| 不卡免费追剧大全电视剧网站| 欧美日韩岛国| 久久国产直播|