实现手动书写集合ArrayList工具类。(实现增删改查)

实现手动书写集合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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值