import java.util.Arrays;
public class ArrayList{
private int size = 0;
private int[] array; //这里先不初始化,在构造方法里初始化,
public ArrayList(int[] array){
this.array = new int[array.length];
// this.array是指属性中的array,而不是形参array.
for(int i = 0; i < array.length; i++){ //把传入数组的所有元素copy到属性array中
this.array[i] = array[i]; //把所有数据传进这里面来
}
size = array.length; //已存入一些数据,更新size
}
//在下标index处插入某个数据,对index做合法性校验
public void insert(int index, int element){
//index的取值范围[0,size]
if(index < 0 || index > size){ //若index超出取值范围则index不合法
System.out.printf("index 取值范围是 [0,%d]%n", size);
return;
}
//确保空间够用,否则扩容
ensureCapacity();
//插入过程
for(int i = size - 1; i >= index; i--){ 倒着遍历,所以是i--
array[i + 1] = array[i]; //要将[index, size-1]数据往后搬移一格
}
array[index] = element; // 插入数据
size++;
}
//删除下标index所在数据元素,要求对 index 做合法性校验
public void erase(int index){
//index的取值范围[0, size - 1]
if(index < 0 || index >= size){
System.out.printf("index的取值范围是[0, %d]%n",size-1);
return;
}
//删除过程:
for(int i = index + 1; i <= size-1; i++){ //要从前往后遍历
array[i - 1] = array[i]; //要把[index + 1, size - 1]的数据往前移动一格
}
size--; //删除了size里面的一个元素,size当然减少,相当于 size-1
}
private void ensureCapacity(){ //因为扩容是内部用的,所以用private
if(size < array.length){ // size是现在有的数据,array.length是容量
return; // 现在是够用的
}
//否则进行扩容
//1. 申请新空间,新空间大小通常为原空间的1.5或者2倍-
int oldCapacity = array.length;
int newCapacity = oldCapacity + oldCapacity / 2;
int[] newArray = new int[newCapacity];
//2.将数据搬到新家
for(int i = 0; i < size; i++){
newArray[i] = array[i];
}
//3.通知大家我的新地址
array = newArray;
//4.释放老空间,GC 会去回收(java里面自动回收)
}
public String toString(){
return Arrays.toString(
Arrays.copyOf(array, size) //从array这个位置拷size个值出来
);
}
public static void main(String[] args){
int[] array = {1, 2, 3, 4, 5};
ArrayList arrayList = new ArrayList(array); //构造方法就会把array这个数组拷贝到自己的顺序表中,通过这种方式去初始化
System.out.println(arrayList.toString()); //插入之前的样子
arrayList.insert(5, 106); //不扩容之前:会报错(因为数组空间越界,需要扩容) 因为数组空间只有5个,插入后需要6个空间,因此需要扩容
System.out.println(arrayList.toString()); //插入之后的样子
arrayList.erase(1); //删掉数组 1 位置这个数据
System.out.println(arrayList.toString());
}
}