手动实现ArrayList

当我们创建一个数组对象的时候 必须要明确空间大小
   ArrayList底层基于Object[]实现的
   其实我们可以再创建ArrayList对象的时候 明确底层
   开辟多大的数组对象 再构造方法里面传参数
   参数:表示底层数组对象开辟多大空间
   当我们调用无参构造方法的时候 底层默认开辟10块内存空间
   但是不代表只能装10个元素
   集合会自动扩容:
   jdk6.0及之前 x*3/2+1 ->10 -> 16 -> 25....
   jdk7.0及之后 x+(x>>1)->10 -> 15 -> 22...
   但是再开发的时候 尽量避免扩容:
    1:创建新的数组对象
    2:将老数组里面的元素复制进新数组里面
    3:改变引用指向
    4:回收老数组对象
    5:继续添加元素
/ArrayList
 //属性:data   size
 //构造方法:有参  无参
 //普通方法:
  //size()
  //get()
  //add()
  //remove()
  //remove()
  //contains()
  //toString()
  //trimToSize()
  //ensureCapacity()


import java.util.*;
public class TestArrayList8Plus{
	public static void main(String[] args){
		AList<Integer> list = new AList<Integer>();

		list.add(45);
		list.add(77);
		list.add(666);

		//Collections.addAll(list,56,77,90);

		System.out.println(list.size());
		System.out.println(list.get(2));

		System.out.println(list.contains(45));

		System.out.println(list);
	}
}
class AList<E>{
	//属性:

	private Object[] data;
	private int size;

	//构造方法
	public AList(int x){
		data = new Object[x];
	}

	public AList(){//[]:10
		data = new Object[10];
	}

	//方法:
	//int x = list.size();
	public int size(){
		return size;//0
	}

	//Object obj = list.get(int x);
	public Object get(int x){
		return data[x];
	}

	//void -> list.add(Object obj);
	public void add(E obj){
		if(data.length == size){
			Object[] temp = new Object[size + (size >> 1)];//null
			System.arraycopy(data,0,temp,0,size);
			data = temp;
			data[size] = obj;
			size++;
		}else{
			data[size] = obj;
			size++;
		}
	}

	//void -> list.remove(3);
	public void remove(int x){
		System.arraycopy(data,x+1,data,x,size-(x+1));
		size --;
	}

	public void remove(Object obj){
		//[]:10 -> 2
		for(int x = 0;x < size;x++){
			if(obj.equals(data[x])){
				remove(x);
				break;
			}
		}
	}

	//list.contains(元素)
	public boolean contains(Object obj){
		//obj调用equals方法和集合里面的每一个元素作比较
		//张三  李四  王五
		//list.contains("李四")

		for(int x = 0;x < size;x++){//10->2
			if(obj.equals(data[x])){
				return true;
			}
		}
		return false;
	}

	public void ensureCapacity(int x){
		if(x <= data.length){
			System.out.println("已经确保有" + x + "块容量");
		}else{
			Object[] temp = new Object[x];
			System.arraycopy(data,0,temp,0,size);
			data = temp;
		}
	}

	public void trimToSize(){
		Object[] temp = new Object[size];
		System.arraycopy(data,0,temp,0,size);
		data = temp;
	}

	@Override
	public String toString(){

		//[元素1,元素2,元素3]

		StringBuffer buffer = new StringBuffer("[");

		for(int x = 0;x < size;x++){
			//x -> 下标
			//data[x] -> 元素
			buffer.append(data[x]);
			if(x != size - 1){
				buffer.append(",");
			}
		}
		buffer.append("]");

		return buffer.toString();




	}


}















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值