国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ArrayList源碼分析

2019-11-15 01:12:33
字體:
來源:轉載
供稿:網友
ArrayList源碼分析

ArrayList是java中最常使用的動態數組,其具體使用方式就不再介紹,本文只是從源碼角度介紹它內部的序列化和擴容機制。ArrayList作為集合框架中的一員,它的繼承關系如下所示:

image

public class ArrayList<E> extends AbstractList<E> implements Cloneable, Serializable, Randomaccess

從它實現的接口來看,ArrayList支持clone,序列化,隨機訪問。在類中維持了兩個成員變量:

int size;transient Object[] array;

其中size是ArrayList的長度,array是一個object類型的數組用于存儲數據元素,元素本身也可以為null。等等,這里為什么事transient來修飾的呢?說好的序列化呢?

原來,ArrayList并沒有使用默認的序列化機制,而是實現了readObjectwriteObject 方法來完成序列化工作:

PRivate void writeObject(ObjectOutputStream stream) throws IOException {        stream.defaultWriteObject();        stream.writeInt(array.length);        for (int i = 0; i < size; i++) {            stream.writeObject(array[i]);        }    }    private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {        stream.defaultReadObject();        int cap = stream.readInt();        if (cap < size) {            throw new InvalidObjectException(                    "Capacity: " + cap + " < size: " + size);        }        array = (cap == 0 ? EmptyArray.OBJECT : new Object[cap]);        for (int i = 0; i < size; i++) {            array[i] = stream.readObject();        }    }

這種方法比默認的機制更為高效,它并未存儲整個數組中的null,這樣節省了很多空間。

解釋完序列化的疑問,我們來看一下它的動態增長機制,在add方法中:

public boolean add(E object) {        Object[] a = array;        int s = size;        if (s == a.length) {            Object[] newArray = new Object[s +                    (s < (MIN_CAPACITY_INCREMENT / 2) ?                     MIN_CAPACITY_INCREMENT : s >> 1)];            System.arraycopy(a, 0, newArray, 0, s);            array = a = newArray;        }        a[s] = object;        size = s + 1;        modCount++;        return true;    }

我們可以看到,當數組容量不足對數組擴容的時候,有一個判斷:當前長度是否是最小增長長度(MIN_CAPACITY_INCREMENT 12)的1/2,如果小于則按最小增長長度進行擴容,否則擴容為當前容量的3/2.

以上便是ArrayList源碼學習中需要注意的兩個疑問。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嵊州市| 霍州市| 高清| 谢通门县| 石台县| 龙胜| 凤阳县| 怀柔区| 太和县| 新建县| 水城县| 苍山县| 商洛市| 鹤峰县| 红安县| 贡嘎县| 晋城| 邵阳县| 都匀市| 乾安县| 天台县| 大渡口区| 鄂州市| 蒙阴县| 涿鹿县| 四川省| 博湖县| 车险| 清远市| 莲花县| 集安市| 益阳市| 宁都县| 揭西县| 图片| 大同县| 甘德县| 延吉市| 铁岭县| 凤山市| 浦北县|