手書きArrayListの実現、原理及び最適化

3333 ワード

一、前言
arraylistセットの場合、これはListインタフェースの下のデータストレージ構造であり、下位層は配列から構成される.自身の特徴は:検索が速く、削除が遅い(原因:下層は配列であるため、配列は連続的な空間を必要とし、毎回の削除は配列の移動と複製に相当し、効率が大幅に低下する.しかし、クエリーでは効率が極めて高い.)
二、核心
     1. jdkソースコードを参照すると、次のように要約できます.
  • がaddメソッドの追加を行った後、デフォルト値はまず0であり、次に判断があり、デフォルト値を10にする.
  • 拡張メカニズムは1.5倍の拡張であり、ビット演算(javaにおけるビット演算の効率が高い)を採用している.
  • コアコードは
  • System.arraycopy (objects,0,temp,0,objects.length);

    配列のコピーとして機能します.パラメータは、ソースオブジェクト、ソースオブジェクトの開始位置、ターゲットオブジェクト、ターゲットオブジェクトの開始位置、コピー要素の数の順です.
         2. ArrayListはスレッドではなく安全であり、複数のスレッドが同時に同じarraylistに対してデータを変更するとデータの不一致やデータ汚染を招くため、スレッドの不安全な操作が発生した場合、arraylistは可能な限りconcurrentModifycationExceptionを放出してデータ異常を防止する.スレッドのセキュリティを保証するにはvectorを使用します...
    三、手書きarraylistの簡単な実現
    package Arraylist;
    
    import sun.applet.Main;
    
    import java.lang.reflect.Array;
    import java.util.ArrayList;
    import java.util.Objects;
    
    public class MyArraylist {
    
        //    ,jdk      10
        private Object[] objects = new Object[3];
        //    
        private int size = 0;
    
        //       
        public void add(Object obj){
            //            ,    ,   (    )arraylist    1.5   
            if(size >= objects.length){
                //jdk        ,           
                Object[] temp = new Object[size*3/2 + 1];
                //    ,        
                System.arraycopy (objects,0,temp,0,objects.length);
                objects = temp;
            }
            objects[size] = obj;
            size++;
        }
        //     
        public int length(){
            return size;
        }
        //         
        public void set(int index,Object obj) throws Exception {
            if(index <= size && index >= 0){
                    objects[index] = obj;
            }else{
                throw new Exception ("      ");
            }
        }
        //         
        public Object getValue(int index) throws Exception {
            if(index > size || index < 0){
                throw new Exception ("      ");
            }
            return objects[index];
        }
        //         
        public Object remove(int index) throws Exception {
            if(index > size || index < 0){
                throw new Exception ("      ");
            }
            //      
            Object obj = objects[index];
            //               ,  newIndex (          )
            int newIndex = objects.length-1-index;
            System.arraycopy (objects,index+1,objects,index,newIndex);
            //    ,     
            size--;
            return obj;
        }
        //    
        public void clear(){
            size = 0;
            objects = new Object[3];
        }
    
        //    
        public static void main(String[] args) throws Exception {
            MyArraylist ma = new MyArraylist ();
            ma.add ("1");
            ma.add ("2");
            ma.add ("3");
            ma.add ("4");
    //        ma.clear ();
    //        System.out.println (ma.size);
    //        System.out.println (ma.remove (2));
            for (int i = 0;i < ma.length ();i++){
                Object obj = ma.getValue (i);
                System.out.println (obj);
            }
    
        }
    }
    

    四、最適化
  • 初期化時にArrayListの初期容量を知っている場合は、最初から容量ArrayListリスト=new ArrayList(20)を指定してください.
  • 最初に容量が分からなかった場合、途中で知った場合はlistを呼び出してください.ensureCapacity(20);容量を拡張します.
  • データが追加されましたが、メモリに保存する時間が必要な場合はlistを呼び出します.trimToSize()は、コンテナをストレージ要素の容量に最小化し、これらのストレージスペースの無駄を排除します.