写一个类手动模拟实现ArrayList,Java笔试常考

public class TestArrayList{
	public static void main(String[] args){
		//测试模拟实现是否成功
		TestList list = new TestList();//data:10
		list.add(77);
		list.add(55);
		list.add("testtest");
		System.out.println(list.size());
		System.out.println(list.get(0));
		list.remove(new Integer(77));
		System.out.println(list.size());
	}
}

//自己写一个类模拟实现ArrayList
class TestList{
	//属性:对象有什么
	private Object[] data;//装元素的容器
	//专门用来装元素个数的
	private int size;    //add() size++  remove()  size--

	//构造方法:
	//有参构造:参数表示数组空间大小
	//TestList(-34);->data:34
	public TestList(int x){       //x : 空间大小
		if(x < 0){
			System.out.println("参数错误");
		}else{//x >= 0
			data = new Object[x];
		}
	}

	public TestList(){
		//默认开辟10块空间
		//data = new Object[10];
		this(10);
	}

	//方法:
	//得到集合里面的元素个数
	//int -> list.size();
	public int size(){
		return size;
	}

	//得到集合里面某一个元素:
	//Object obj = list.get(3)
	public Object get(int x){//x -> 下标
		//当我们往集合里面添加元素的时候 所有的元素
		//最终都要添加进data数组里面
		//当我们问集合要下标x的时候 只能讲数组的下标x
		//返回
		return data[x];
	}

	//如何添加元素:
	//void -> list.add(元素);
	public void add(Object obj){
		//当我们想要王集合俩面添加元素的时候
		//最终都要把元素添加进data数组里面
		//当我们往数组里面添加元素的时候 需要判断当前数组对象满了吗?
		if(data.length == size){
		//如果满了
			//扩容
			//创建一个更大的数组对象
			//jdk6.0  x * 3 / 2 + 1
			//jdk7.0  x + (x >> 1)
			Object[] temp = new Object[size * 3 / 2 + 1];
			//将老数组里面的元素复制到新数组里面
			System.arraycopy(data,0,temp,0,size);
			//改变引用指向
			data = temp;//参数传递
			//回收老数组对象 -》 gc
			//继续添加元素
			data[size] = obj;
			//size+1
			size++;
		}else{
			//如果没满
			//直接添加元素obj
			data[size] = obj;
			//size+1
			size++;
		}

		/**
			已有元素个数	最大下标	新来下标
				1			   0			1
				2			   1			2
				3			   2			3
				size		   size-1		size
		*/
	}
	//如何删除元素:
	//void ->  list.remove(3)
	public void remove(int x){//x -> 下标
		//当我们想要从集合里面删除下标x的时候
		//其实就是从数组里面删除下标x

		//data -> 删除 -》 数组复制
		System.arraycopy(data,x+1,data,x,size-x-1);
		size--;
		/**
			34		77		82		90
			[0]		[1]		[2]		[3]

			删除下标0  从下标1开始复制   复制3=4-1个元素
			删除下标1  从下标2开始复制	 复制2=4-2个元素
			删除下标2  从下标3开始复制	 复制1=4-3个元素
			删除下标x  从下标x+1开始复制 复制size-(x+1)
		*/
	}
	//如何删除元素:
	//void -> list.remove(元素);
	public void remove(Object obj){
		//当我们要删除元素obj的时候 底层拿着obj
		//和集合里面的每一个元素做equals比较

		for(int x = 0;x < size;x++){
			//x -> 下标  元素:data[x]
			if(obj.equals(data[x])){
				//下标x对应的元素和obj视为相等独享
				//那么就要删除下标x对应的元素
				remove(x);
				break;
			}
		}

	}
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值