我们在使用数组这种数据类型的时候会遇到一个问题,就是这个数组在一开始的时候就要确定一定的长度,这使得数组的容量有限,一旦后续需要存储的数据个数超过了数组长度,就无法再存储了。
为了在实际应用中,有一个可以不限制长度的数组,我们要自己实现一个ArrayList。实现ArrayList的方法是通过对数组和相关参数进行封装,来起到自动扩容的作用。具体来说,就是当数组没有被填满的时候,后续的数据和普通数组一样存入,当要数组被填满的时候,我们就new一个新的,更长的数组,将原来的数组内容以此复制到新的数组内,并存入新的待存储数据。
我们将每次申请的新数组长度设置为原数组长度的1.5倍,不是每一次都只添加一个是因为:这样可以有效降低在需要输入大量数据的时候,算法的时间复杂度。在添加过程中,n==size+1的时候时间复杂度为O(n),其他时候时间复杂度为O(1)。而如果每一次申请的数组长度都比之前多1的话,就会导致每一次的数据总量n==size+1,进而每一次的时间复杂度都为O(n)。
有了思路就好实现代码了。
public class SArrayList<E> {
private Object[] arr = new Object[10]//申请一个初始长度为10的数组;
private int size;//arraylist的长度
//添加
public void add(E data) {
//如果数组满了就申请扩容,如果不满就直接填入,并且size++
if (size == arr.length) {
//new 一个新的数组
Object[] arr = new Object[(int)(1.5*size)];
//原数组数据转存到新数组
for (int i = 0;i<size;i++) {
arr[i] = this.arr[i];
}
size++;
arr[size] = data;
this.arr = arr;
}
else {
size++;
arr[size] = data;
}
}
//删除
public E remove(int index) {
E temp = (E)arr[index];
for(int i = index;i<size-1;i++){
arr[i] = arr[i+1];
}
size--;
return temp;
}
//查询
public E get(int index) {
return (E)arr[index];
}
//获得长度
public int size() {
return size;
}
}