JAvaにおけるArrayListクラス実装方法の簡易実装(手書き版、詳細コメント説明付)

4396 ワード

import java.util.Arrays;

public class ListTest {


    public static void main(String[] args) {
        //      
        ListArray listArray = new ListArray();
        listArray.add("a");
        listArray.add("b");
        //    toString()  ,       Object      
        listArray.add(0,"c");
        listArray.remove(0);
        System.out.println(listArray);
    }
}

/**
 *      ArrayList
 *     ,   String
 */

class ListArray{
    //  String           
    String[] data;
    //          /       
    int size = 0;
    //      --   ,     10
    //ArrayList       private static final int DEFAULT_CAPACITY = 10;
    public ListArray(){
        data = new String[10];
    }
    //    ,      
    public ListArray(int initCpacity){
        data = new String[initCpacity];
    }

    /**
     *     
     */
    public void grow(){
        //                   ,   0-1       ,           1   
        //  1   
        //         0/1
        if (data.length <= 1){
            data = Arrays.copyOf(data,data.length+1);
        }else {
            //                  ,  data.length>>1      
            //    ,       50%
            /**
             * java         
             * <<      :          ,num << 1,   num  2
             * >>      :          ,num >> 1,   num  2
             * >>>    :          ,     ,    0  
             */
            data = Arrays.copyOf(data,data.length+(data.length>>1));
        }

    }
    /**
     *     
     */
    public void isOut(int index){
        if(index<0 ||index>=size){
            //    
            throw new IllegalArgumentException("Index"+index);
        }
    }
    /**
     *     
     * @param str
     */
    public void add(String str){
        //data[size] = str;
        //        size++,          
        //size++;
        //          
        if (size >=data.length){
            grow();
        }
        //     
        data[size++] = str;
    }

    /**
     *     
     * @param index   
     * @param str      
     */
    public void add(int index,String str){
        //        
        if (index<0 || index>size){
            //    
            throw new IllegalArgumentException("Index"+index);
        }
        //        
        if (size>=data.length){
            grow();
        }
        //    ,              
        //      ,    
//        for (int i = size-1;i>=index;i--){
//            //              
//            data[i+1] = data[i];
//        }
        //       
        /**
         * public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
         *     :
         *   Object src :    
         *    int srcPos :            
         *   Object dest :     
         *   int destPos :            
         *   int length  :  copy      
         */
        System.arraycopy(data,index,data,index+1,size-index);
        //    
        data[index] = str;
        //      
        size++;
    }

    /**
     *      --    
     * @param index   
     */
    public void remove(int index){
        //      ,    index = size -1;
        isOut(index);
        //  
        //              
//        for (int i =index;itoIndex){
            throw new IllegalArgumentException("FromIndex"+fromIndex+",ToIndex"+toIndex);
        }
        //      
        int count = toIndex - fromIndex;
        //       ,      
        ListArray list = new ListArray(count);
        //              
        System.arraycopy(data,fromIndex,list.data,0,count);
        //        size
        list.size = count;
        //       
        return list;
    }
    //  toString   ,      
    public String toString(){
        StringBuilder sbr = new StringBuilder("[");
        //      ,      
        for (int i=0;i0)
        s = s.substring(0,s.length()-2);
        //     
        return s+="]";
    }
}