1. 程式人生 > >ArrayList.add() 方法原始碼解析

ArrayList.add() 方法原始碼解析

        List<String> list=new ArrayList<String>();
      解析原始碼的方法>>>  list.add("hello");

該方法涉及到的方法被我複製到了一個類中,至於解釋,全在註釋上。初次解析,別噴我!!!

如有不足望評論,隨時補充。

package com.nc.sourceCode;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class SourceCodeTest_02<E> {

    
    public static void main(String[] args) {
        
        user us=new user();
        
        System.out.println(us.getA());
        
        List<String> list1=new ArrayList<String>();
        System.out.println("開始新增");
//        for (Integer i = 0; i <2100000000; i++) {
//            list1.add(i.toString());
//        }
        System.out.println(list1);
        list1.add("我就不信了");
        
        int a1=2147483647;
        int a2=a1+1000;
        System.out.println(a1+"    "+a2);
        
        System.out.println("=====Arrays.copyOf()方法測試====");
        String [] str={"7","6","5","4","3","2","1"};
        String[] copyOf = Arrays.copyOf(str, 3);
        for (String string : copyOf) {
            System.out.print(string+"   ");
        }
        System.out.println();
        System.out.println(-6-200);
        System.out.println("======位運算子測試======");
        int a=109;
        System.out.println("運算前:"+a);
        System.out.println(a>>1);
        System.out.println(a+(a>>1));
        System.out.println(a+a>>1);
        System.out.println("運算後:"+a);
        System.out.println("=======list集合測試=========");
        List<String> list=new ArrayList<String>();
        list.add("我去哦");
        int size2 = list.size();
        System.out.println("list.size()="+size2);
        System.out.println(list);
        System.out.println(list.get(0));
        System.out.println("=====數學測試======");
        int max = Math.max(10, 1);
        System.out.println(max);
        System.out.println(Integer.MAX_VALUE);
    }
    
    
    
    transient Object[] elementData; 
    private int size;
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  //進行陣列長度處理
        elementData[size++] = e;//實際新增元素的操作
        return true;
    }
    private void ensureCapacityInternal(int minCapacity) {//類似中轉站
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
    
    private static final int DEFAULT_CAPACITY = 10;
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    //返回一個最大值
    private static int calculateCapacity(Object[] elementData, int minCapacity) {//判斷陣列是否為空(也就是看下是否是第一次集合中新增資料),初始長度為10,否則則就返回陣列的下一位元素的下標,也就是上面的size+1
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);//返回兩個值中的大的那個
        }
        return minCapacity;
    }
    

    protected transient int modCount = 0;
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
        if (minCapacity - elementData.length > 0)//超出object[]長度時
            grow(minCapacity);
    }
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//2147483647-8
    
    private void grow(int c) {//在這個方法中進行長度判斷,如果超出當前陣列長度,則擴充套件長度為當前長度的一半或者擴充套件長度為1
        int a = elementData.length;//獲取陣列長度
        int b = a + (a >> 1);//類似於除以2,如果為單數,則減一後除以2
        if (b - c < 0)
            b = c;
        if (b - MAX_ARRAY_SIZE > 0)//基本不可能發生,誰會閒著沒事往一個list集合裡面放21億多個數據呢
            b = hugeCapacity(c);
        elementData = Arrays.copyOf(elementData, b);//拷貝elementData陣列元素從0位到c位至elementData陣列
    }
    
    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }
    
    
    public static <T> T[] copyOf(T[] original, int newLength) {//實際擴產長度的方法,先建立一個指定長度的陣列,然後將原陣列拷貝到新的陣列中並返回新陣列
        return (T[]) copyOf(original, newLength, original.getClass());
    }

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);//建立一個指定型別和長度的陣列
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));//將original源陣列中從第0位開始到Math位結束的元素拷貝到copy陣列中從copy陣列的地0位開始拷貝
        return copy;
    }
    
    

}