今天我们来构建一个简单的数组类
对于数组其实比较简单啦,我们用int类型的数组完成第一步,后续可以用泛型替代int
//底层是一个数组
private int data[];
//数组中元素的个数,size从0开始 满足size <= data.length,如果大于需要扩容
private int size;
1.一些常用的方法
public Array(){
this(10);
}
/**
* 获取元素个数
* @return 元素个数
*/
public int getSize(){
return size;
}
public int getCapacity(){
return data.length;
}
public boolean isEmpty(){
return size == 0;
}
注意点:这里的capacity和size是两个概念,capacity是数组最大容量,size是当前元素个数
同时还要注意索引index 三者关系是 max(index) = size - 1 <=length
2.关键方法,在指定位置插入元素
/**
* 在指定index处插入元素e,原数组元素从index+1处往后移动一个元素,但是保证max(size) = length - 1
* @param index 索引
* @param e 元素e
*/
public void add(int index, int e){
//size代表个数,length也数组容量,最大索引应该是size - 1
//如果length = 10,size=9 当add一个时候,size =10了 再add就不行,因此size最大值就是length
//所以需要校验
if(size == data.length){
//todo 等待扩容
}
//看临界,index==size会怎么样,上面有一步判断也就是最大size = length - 1
//这时候length = 10,size = 9,因此index 最大等于8 ,如果index == size = 9的话
//那么length 最低也是10 很明显的冲突的,结论index不可等于size
if(index < 0 || index >= size){
throw new IllegalArgumentException("error index");
}
//索引必须在[0,size-1]中,从最后遍历,size- 1开始到
for(int i = size - 1; i >= index; i--){
//从index 到size - 1,每个都往后移动一个,比如size = 5 index = 2
// i 从 4 >>>2
// 这样就从 data[5]<--data[4]<--data[3]<--data[2] 往后移:此时data[3] =data[2]
data[i + 1] = data[i];
}
data[index] = e;
size ++;
}
}
这里主要是理解,数组遍历从数组末尾往index处遍历,然后每次都将值赋值给后面的值,同时注意 index 不能等于length 因为需要至少要空出一个来放插入的元素,因此max(size)= length - 1 因此max(index)=max(size - 1) = length - 2,---> index != size 进而就是size !=length
3.总结:
这一部分重点就在于数组的插入设计的原理里就是从数组末尾遍历至index处,然后数组素往后移一位,空出一位直接赋值即可,
别忘了维护size ++哦