public class MayiktArraylist<E> implements MayiktList<E> { private static final int DEFAULT_CAPACITY = 10; // 2的23次方-8 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; /** * elementData 數組存放我們Arraylist所有的數據 transient作用是不能被序列化 */ transient Object[] elementData; //給數組容量賦值爲空 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //數據容量 默認大小爲0 private int size; public MayiktArraylist() { //給數組容量賦值爲空 this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } @Override public int size() { return size; } @Override public boolean add(E e) { //對數組實現擴容 ensureCapacityInternal(size + 1); // Increments modCount!! //數組元素賦值 elementData[size++] = e; return true; } @Override public E get(int index) { return null; } private static int calculateCapacity(Object[] elementData, int minCapacity) { //添加元素 如果數組爲空的情況下 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { // DEFAULT_CAPACITY == 10 加入 minCapacity==5 則返回 minCapacity w爲大的值 10 return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; } private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } // 增刪改查的時候 modCount++; private void ensureExplicitCapacity(int minCapacity) { // modCount++; // overflow-conscious code // minCapacity=10 minCapacity.length=0 則 10-0>0 判斷我們數組是否需要繼續擴容 if (minCapacity - elementData.length > 0) //對數組實現擴容 grow(minCapacity); } private void grow(int minCapacity) { // overflow-conscious code //獲取我們數組的長度 old 原來的 則爲0 int oldCapacity = elementData.length; // oldCapacity >> 1等效於 oldCapacity/2(往右移動是除以2、往左移動是乘以2) int newCapacity = oldCapacity + (oldCapacity >> 1); //如果新的小於 minCapacity ,則把minCapacity 賦值給 newCapacity if (newCapacity - minCapacity < 0) //作用 第一次對我們的數組進行初始化容量操作 newCapacity = minCapacity; //判斷我們擴容長度大於 Integer(21) 最大值的情況 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); } /** * 判斷我們最小的初始化容量 * 限制數據擴容的最大值 * @param minCapacity minCapacity==當前數據> Integer(21)的情況,則直接取 Integer.MAX_VALUE,否則 就取這個MAX_ARRAY_SIZE * @return */ private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } } //以上內容來自於螞蟻課堂學習視頻
List部分源碼解析筆記
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.