手書きArrayListの実現、原理及び最適化
3333 ワード
一、前言
arraylistセットの場合、これはListインタフェースの下のデータストレージ構造であり、下位層は配列から構成される.自身の特徴は:検索が速く、削除が遅い(原因:下層は配列であるため、配列は連続的な空間を必要とし、毎回の削除は配列の移動と複製に相当し、効率が大幅に低下する.しかし、クエリーでは効率が極めて高い.)
二、核心
1. jdkソースコードを参照すると、次のように要約できます.がaddメソッドの追加を行った後、デフォルト値はまず0であり、次に判断があり、デフォルト値を10にする. 拡張メカニズムは1.5倍の拡張であり、ビット演算(javaにおけるビット演算の効率が高い)を採用している. コアコードは
配列のコピーとして機能します.パラメータは、ソースオブジェクト、ソースオブジェクトの開始位置、ターゲットオブジェクト、ターゲットオブジェクトの開始位置、コピー要素の数の順です.
2. ArrayListはスレッドではなく安全であり、複数のスレッドが同時に同じarraylistに対してデータを変更するとデータの不一致やデータ汚染を招くため、スレッドの不安全な操作が発生した場合、arraylistは可能な限りconcurrentModifycationExceptionを放出してデータ異常を防止する.スレッドのセキュリティを保証するにはvectorを使用します...
三、手書きarraylistの簡単な実現
四、最適化初期化時にArrayListの初期容量を知っている場合は、最初から容量ArrayListリスト=new ArrayList(20)を指定してください. 最初に容量が分からなかった場合、途中で知った場合はlistを呼び出してください.ensureCapacity(20);容量を拡張します. データが追加されましたが、メモリに保存する時間が必要な場合はlistを呼び出します.trimToSize()は、コンテナをストレージ要素の容量に最小化し、これらのストレージスペースの無駄を排除します.
arraylistセットの場合、これはListインタフェースの下のデータストレージ構造であり、下位層は配列から構成される.自身の特徴は:検索が速く、削除が遅い(原因:下層は配列であるため、配列は連続的な空間を必要とし、毎回の削除は配列の移動と複製に相当し、効率が大幅に低下する.しかし、クエリーでは効率が極めて高い.)
二、核心
1. jdkソースコードを参照すると、次のように要約できます.
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);
}
}
}
四、最適化