1. 程式人生 > >JDK源碼 - ArrayList

JDK源碼 - ArrayList

public sys 空數組 ngs swa style 元素 判斷 println

/**
 * ArrayList源碼分析
 * @author liyong
 *
 */
public class Util {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        List list = new ArrayList<>();  
        //① add(E)
        //ArrayList類有一個屬性 -> transient Object[] elementData; 
        //創建對象就是 給elementData 賦值
        list.add(1);
        // 添加第一個元素時,會進行判斷,如果elementData沒有位置,會分配10個位置,然後將元素加入到elementData
        list.add(2);
        // 添加的第二個元素時,同樣會判斷,如果分配的位置索引小於添加進去的索引值,則會將elementData數組擴容,
        // int newCapacity = oldCapacity + (oldCapacity >> 1); 略等於1.5倍擴容,擴容之後在添加
        // 每次添加是如何進行判斷的呢?
        // 1 elementData == {} 判斷elementData是否是空數組,如果是,minCapacity = 10
        // 如果新索引值 > elementData.length,進行某方法 : 就是生成新的數組(無論是擴容還是第一次添加)
        // modCount記錄elementData的個數
        
        //② add(index,E)  跟上面類似,只是在指定的索引處添加值
//        list.add(5, 5);
        //③ 其他add看看得了
        //list.addAll(c) 
        Iterator ir = list.iterator();  //返回的是Itr對象 -> ArrayList裏面的一個內部類
        while(ir.hasNext()){
            System.out.println(ir.next());
        }
        
        int size = list.size();
        
        list.clear();
        
        list.contains(1);
        
        list.containsAll(new ArrayList());
        // 總結 : 看懂了70%吧,ArrayList底層是數組,初始長度10,當添加的數據過長後會擴容,按照這個算法(>> 1)擴容
    }
}

  

JDK源碼 - ArrayList