实现手动书写集合ArrayList工具类。
实现手动书写集合ArrayList工具类。(实现增删改查)
public class ArrayList<E> implements List<E>{
//列表数据存放的位置
private Object []array;
//长度
private int size1;
//设置默认长度为4
public ArrayList() {
this.array=new Object[4];
}
//用户选择设置初始长度为多少
public ArrayList(int i) {
this.array=new Object[i];
}
//用于数组自动扩容
private void grow() {
if (size1==array.length) {
//这个是调用api的方法,扩容数组大写自己控制
array = Arrays.copyOf(array,array.length*2);
//这个是原生方法
// 在创建个新的数组吧数据放到新的数组,数组大写自己控制
// Object[] array2=new Object[array.length*2];
// for (int i = 0; i < array.length; i++) {
// //把数据转移到新数组
// array2[i]=array[i];
// }
// //吧扩完容的数组在给旧数组
// array=array2;
}
}
//返回集合长度
@Override
public int size1() {
return size1;
}
//添加元素
@Override
public void add(E obj) {
//如果数组长度等于数据长度时,进行自动扩容
grow();
//默认是在尾部添加,尾部也就是size的长度。
array[size1]=obj;
//长度+1;
size1++;
//因为每次扩容是增加的2被,ArrayList()中是可以存放null的数据的
//所以我们每次都初始化一下,吧有用的数据,也就是size1的长度,
//吧数据放进个新的,在吧新的数组数据给旧的数组
//这样的话保证扩容完之后不会输出null值
//创建一个新数组长度设置为size1;
Object[]arr2=new Object[size1];
//遍历arr2,因为遍历的是arr2,所以只会循环arr2的长度;
for (int j = 0; j <=arr2.length-1; j++) {
//吧array[j]长度等于arr2长度的数据给arr2
//就是取循环范围内的数据,默认索引从0开始
arr2[j]=array[j];
}
//在吧arr2的数据给array;
//相当于把数据更新了。
array=arr2;
}
//插入元素
@Override
public void add(int i,E obj) {
grow();
//获得所有大于要插入数组的数据
for (int j = size1; j >i; j--) {
//让后吧长度变成索引, 吧数据前一个索引的数据给后边的索引的数据
// array[j] 也就是最后一个索引+1, 也就是数据的长度。是空的;
//array[j-1] 也就是数组最后一个数据索引,付给我们的空数组,以此向后挪数据。
//吧要添加的数据的位置空出来,然后把数据放进去。
array[j]=array[j-1];
}
array[i]=obj;
size1++;
//因为每次扩容是增加的2被,ArrayList()中是可以存放null的数据的
//所以我们每次都初始化一下,吧有用的数据,也就是size1的长度,
//吧数据放进个新的,在吧新的数组数据给旧的数组
//这样的话保证扩容完之后不会输出null值
//创建一个新数组长度设置为size1;
Object[]arr2=new Object[size1];
//遍历arr2,因为遍历的是arr2,所以只会循环arr2的长度;
for (int j = 0; j <=arr2.length-1; j++) {
//吧array[j]长度等于arr2长度的数据给arr2
//就是取循环范围内的数据,默认索引从0开始
arr2[j]=array[j];
}
//在吧arr2的数据给array;
//相当于把数据更新了。
array=arr2;
}
//修改元素
@Override
public void set(int i, E obj) {
array[i]=obj;
}
//获取元素
@Override
public E get(int i) {
if (i<0 || i>size1) {
throw new IndexOutOfBoundsException("数组下标越界"+i);
}
return (E) array[i];
}
//删除元素
@Override
public void remove(int i) {
for (int j=i; j<size1; j++) {
//吧用户输入的值给变量j,
//每一次循环让j(也就是i)后边的数据吧前边的数据覆盖掉
//判断一下当j不等于最后一个索引数据时才进行数据前移
if (j!=size1-1) {
array[j]=array[j+1];
}
}
//让长度减一
size1--;
//创建一个新数组长度设置为size1;
Object[]arr2=new Object[size1];
//遍历arr2,因为遍历的是arr2,所以只会循环arr2的长度;
for (int j = 0; j <=arr2.length-1; j++) {
//吧array[j]长度等于arr2长度的数据给arr2
//就是取循环范围内的数据,默认索引从0开始
arr2[j]=array[j];
}
//在吧arr2的数据给array;
//相当于把数据更新了。
array=arr2;
}
@Override
public String toString() {
StringBuilder str=new StringBuilder("[");
String st="";
for (int i = 0; i < array.length; i++) {
st+=array[i]+",";
}
String sub = st.substring(0,st.length()-1);
str.append(sub);
str.append("]");
return str.toString();
}
}