手动一个ArrayList底层的增删查过程如下:
新建一个包其中一个底层类一个测试类
首先实现向ArrayList中添加:
在实现添加之前需要声明一个私有集合所有用户向ArrayList中存入的数据都会到这个集合中:
在MyArrayList这个类创建一个add方法,obj是用户使用add方法时带入的数据:
首先用户第一次使用时这个ArrayList时,他底层的arr集合肯定是个空的,所以需要先做一个判断
这个 if 判断的意思是:如果 arr[ ] 这个集合是个空的,就会 new 一个新的开辟了一个空间的集合赋值给 arr[ ] 这个集合这样 arr[ ] 就成了有一个空间的集合,然后把用户带入到值,放到 arr[ ] 这个集合下标为 0 的位置上,这个就是用户第一次使用ArrayList的原理。
else 代表 arr[ ] 不为空,不为空可以分4步实现:
首先,创建一个新的数组 newarr[ ],因为是添加,所以这个新数组的长度要比旧数组的长度长一个空间,所以新数组的空间可以用 arr.length+1 来表示。
第二步,把老数组的值复制过来,可以用一个 for 循环,i 对应下标,把旧数组 arr[ ] 的值一个个复制到新数组 newarr[ ] 中。
第三步,加入新的值,因为下标是从0开始的,所以新数组的最后一位的下标会是新数组的长度 -1,加入新值也就是把值放到新数组 newarr [ ] 的最后一位,也就是newarr[newarr.length-1] = obj。
第四步,替换 arr ,用 arr 接收 newarr 达到替换的效果,新增就完成了。
ArrayList删除效果
删除的难点,在于删除数组中间的数据
前面的步骤不变,1、创建新数组,2、把老数组复制过来
/*
删除
*/
public void del(int index){
//创建一个新数组
Object[] newarr = new Object[arr.length-1];
//把老数组的值复制过来
for(int i=0;i<arr.length;i++){//长度为4 i=0、1、2、3 index=2
if(i<index) {//复制0、1
newarr[i] = arr[i];
}else if(i>index){//等于时不做操作 大于时
newarr[i-1] = arr[i];
}
}
//替换arr
arr = newarr;
}
着重解释 for 循环中 if 判断的效果流程:
else 之前的的判断的是:下标小于用户带入到值 index ,也就是说小于 index 的值都不是用户要删除的数据可以直接复制,等于时不做操作,也因为下标对等时没有复制,所以这个等于的下标的数据就相当于被删除了。大于这个下标的会继续复制,但是因为前面空了一个空间所以需要把新数组的长度减一才能对应的上。
Array List查询
查询相对简单,只需要返回用户输入的下标对应的值就可以了
public Object get(int index){
return arr[index];
}
测试:
public class MyList {
public static void main(String[] args) {
MyArrayList ma = new MyArrayList();
ma.add(0);
ma.add(1);
ma.add(2);
ma.add(3);
ma.del(2);
for(int i=0;i<ma.size();i++){
System.out.println(ma.get(i));
}
}
}
这里因为有一个循环遍历,但是我们并不知道 ma 准确长度,所以需要再在底层创捷一个可以知道事实长度的方法:
/*获取arr的实时长度*/
public int size(){
return arr.length;
}