ArrayList 源碼解讀 手寫 部分源碼

今天元宵節 首先祝大家 元宵節快樂

由於疫情嚴重 希望大家待在家裏爲社會做貢獻呢

沒事還是要多多研究底層代碼實現呢 嘿嘿

下面全部內容了 如果有覺得不妥的 留言區 交流哦 共同進步呀

public class MyArrayList<E>{
    private static final int DEFALT_CAPTION =10; //默認長度
    private int size; //數組長度
    private Object[] elementData; //集合中真正使用的值

    //無參構造方法 默認生成 長度爲10 的數組
    public MyArrayList(){
      elementData = new Object[DEFALT_CAPTION];
    }

    //有參構造方法  傳入長度
    public MyArrayList(int capacity){
        if(capacity<0){
            throw new RuntimeException("數組長度不能爲負數"+capacity);
        }else if(capacity==0){
              elementData = new Object[DEFALT_CAPTION];
        }

        elementData = new Object[capacity];
    }

    //add 方法
    public void  add(E o){
        if(size ==elementData.length){
            //>> 右移一位 相當於除以二
            //優先級 中 +- 高於位運算 所以加括號
            Object[]  newArray = new Object[elementData.length+(elementData.length>>1)];
            System.arraycopy(elementData,0,newArray,0,elementData.length);
             elementData = newArray;  //將新數組賦值給 elementData
        }
        elementData[size++]=o; //++在後 先使用後+1
    }

    //get 方法
    public  E get(int index){
         return (E)elementData[index];
    }

    // set  方法
    public  void set(int index,E element){
        elementData[index] =element;
    }

    //判斷數組下標越界
    public void checkRange(int index){
       if(index<0||index>size-1){
           throw new RuntimeException("數組下標越界:"+index);
       }
    }

    //數組移除操作 傳入移除對象
    public void remove(E element){
        for (int i = 0; i <elementData.length ; i++) {
            if(element.equals(get(i))){
              //如果相等 就移除
                remove(i);
                break; //有多個相同對象時  保證只移除第一個
            }
        }

    }

    //數組移除操作 傳入下標 從0開始
    public void remove(int index){
        int removeNum = elementData.length-index-1; //需要移除的長度 必須大於0
        if(removeNum>0){
            System.arraycopy(elementData,index+1 ,elementData,index,removeNum);
        }
        elementData[--size] =null; // --在前 先使用 後加一

    }

    //返回集合長度
    public int size(){
        return size;
    }

    //判斷集合是否爲空
    public boolean isEmpty(){
        return  size==0;
    }

    //重寫toStirng 方法 可以直接輸出值
    public String toString(){
            StringBuilder stb = new StringBuilder();
        stb.append("[");
        for (int i = 0; i < size; i++) {
            stb.append(elementData[i]+",");
        }

        stb.setCharAt(stb.length()-1,']');
        return  stb.toString();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章