91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中ArrayList底層擴容原理以及擴容操作的示例分析

發布時間:2022-02-28 10:55:39 來源:億速云 閱讀:181 作者:小新 欄目:開發技術

這篇文章主要介紹Java中ArrayList底層擴容原理以及擴容操作的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

ArrayList是Java集合框架中比較常用的一個數據結構,它的底層是是基于數組實現的。

第一章 前言概述

第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底層擴容原理以及擴容操作的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

米易县| 凤城市| 龙口市| 当雄县| 清水县| 海晏县| 南岸区| 南川市| 阿城市| 涞水县| 石棉县| 乳山市| 囊谦县| 繁昌县| 通渭县| 昌图县| 玉溪市| 肃宁县| 电白县| 金秀| 卓资县| 平邑县| 四川省| 琼结县| 大兴区| 荆州市| 平度市| 自治县| 藁城市| 寿阳县| 阿克| 五家渠市| 富顺县| 尤溪县| 锦州市| 南投县| 张掖市| 临朐县| 襄汾县| 剑阁县| 玛纳斯县|