手工实现ArrayList

思路:我们知道Arraylist底层是数组,所以当我们创建Arraylist对象时就是调用空构造器,让构造器来帮我们创建好一个长度为10(自己拟定的长度)的数组,然后我们可以调用内部提供的各种发放来操作ArrayList,所以让我们自己来手写一个ArrayList。

**第一步:**让我们由简单到难分布完成,先写一个只有增加的而且没有范型的ArrayList。

package 手工实现ArrayList;
/**
 * 手工实现ArrayList
 *
 */
public class HWArrayList {
	private Object[] elementDate; //自定义数组
	private int size; //数组大小
	/**
	 * 构造器
	 */
	public HWArrayList() {
		elementDate=new Object[10];//自定义数组长度为10,当我们创建这个类对象时会自动调用空构造器来创建这个数组
	}
	/**
	 * 增加方法
	 * @param obj
	 */
	public void add(Object obj) {
		elementDate[size++]=obj; //调用增加方法其实就是给这个数组加值
	}
	/**
	 * 为了输出保持与原本一样,重写了toString
	 */
	@Override
	public String toString() {
		StringBuilder sb =new StringBuilder();
		sb.append("[");
		for(int i=0;i<size;i++) {
			sb.append(elementDate[i]+",");
		} 
		sb.setCharAt(sb.length()-1,']');
		return sb.toString();
	}
	
	public static void main(String[] args) {
		HWArrayList hw=new HWArrayList();
		hw.add("自定义ArrayList");
		hw.add("自定义ArrayList2");
		System.out.println(hw);
	}
	
}

第二步: 给add方法增加自动扩容,我们知道ArrayList不需要声明长度,使用为内部可以判断长度是否满,如果满则自动扩容,而扩容说明白了就是创建一个新的且容量比原数组大的数组,然后将旧数组的内容拷贝到新数组,且还多余出来了位置,再将新数组赋值给旧数组,这样就实现了自动扩容。
重点看add方法::::

package 手工实现ArrayList;
/**
 * 手工实现ArrayList
 *
 */
public class HWArrayList {
	private Object[] elementDate; //自定义数组
	private int size; //数组大小
	/**
	 * 构造器
	 */
	public HWArrayList() {
		elementDate=new Object[10];//自定义数组长度为10,当我们创建这个类对象时会自动调用空构造器来创建这个数组
	}
	/**
	 * 增加方法
	 * @param obj
	 */
	public void add(Object obj) {
		//判断数组长度是否满,如果满则扩容
		if(size==elementDate.length) {
			//创建一个新的数组,每次创建数组长度+5
			Object[] newelementDate =new Object[elementDate.length+5];
			//将旧数组内容拷贝到新数组里
			//这是一个内部拷贝方法
			System.arraycopy(elementDate, 0, newelementDate, 0, elementDate.length);
			//然后将新数组赋值给旧数组,这样就完成了数组扩容
			elementDate=newelementDate;
		}
		//如果数组长度没满则按照原来方法加入数据
		elementDate[size++]=obj; //调用增加方法其实就是给这个数组加值
	}
	/**
	 * 为了输出保持与原本一样,重写了toString
	 */
	@Override
	public String toString() {
		StringBuilder sb =new StringBuilder();
		sb.append("[");
		for(int i=0;i<size;i++) {
			sb.append(elementDate[i]+",");
		} 
		sb.setCharAt(sb.length()-1,']');
		return sb.toString();
	}
	
	public static void main(String[] args) {
		HWArrayList hw=new HWArrayList();
		hw.add("自定义ArrayList");
		hw.add("自定义ArrayList2");
		System.out.println(hw);
	}
	
}

接下来就是手写中,其余方法的扩充 :Ection(int index)判断索引是否合法发放remove(int index)给以索引来清除对应值remove(E element)给一个值去查找有没有如果有就删除
其中重点看看 remove(index) 方法,过程很简单,给一个index,先判断索引是否合法,如果合法:依旧是对数组进行copy,只不过,先想法算出拷贝的长度,计算方法是:elementDate.length-index-1,
不会的可以拿纸算一算,有了拷贝长度以后就可以对数组进行copy,就是将index+1的值拷贝到index上

代码如下:

package 手工实现ArrayList;
/**
 * 手工实现ArrayList
 *
 */
public class HWArrayList<E> {
	private Object[] elementDate; //自定义数组
	private int size; //数组大小
	/**
	 * 构造器
	 */
	public HWArrayList() {
		elementDate=new Object[10];//自定义数组长度为10,当我们创建这个类对象时会自动调用空构造器来创建这个数组
	}
	/**
	 * 增加方法
	 * @param obj
	 */
	public void add(E obj) {
		//判断数组长度是否满,如果满则扩容
		if(size==elementDate.length) {
			//创建一个新的数组,每次创建数组长度+5
			Object[] newelementDate =new Object[elementDate.length+5];
			//将旧数组内容拷贝到新数组里
			//这是一个内部拷贝方法
			System.arraycopy(elementDate, 0, newelementDate, 0, elementDate.length);
			//然后将新数组赋值给旧数组,这样就完成了数组扩容
			elementDate=newelementDate;
		}
		//如果数组长度没满则按照原来方法加入数据
		elementDate[size++]=obj; //调用增加方法其实就是给这个数组加值
	}
	//删除方法
	public void remove(int index) {
		Ection(index);
		int sumber=elementDate.length-index-1;
		if(sumber>0) {
			System.arraycopy(elementDate, index+1, elementDate, index, sumber);
			
		}
			elementDate[size-1]=null;
			size--;
	}
	/**
	 * 给值删除
	 * @param element
	 */
	public void remove(E element) {
		for(int i=0;i<size;i++) {
			if(element.equals(elementDate[i])) {
				remove(i);
			}
		}
	}
	/**
	 * 判断索引是否在数组范围内
	 * @param index
	 */
	public void Ection(int index) {
		if(index<0||index>size) {
			throw new RuntimeException("索引不合法:"+index);
		}
	}
	/**
	 * set方法
	 * @param element
	 * @param index
	 */
	public void set(E element,int index) {
		Ection(index);
		elementDate[index]=element;
	}
	/**
	 * get方法
	 * @param index
	 * @return
	 */
	public E get(int index) {
		Ection(index);
		return (E)elementDate[index];
	}
	/**
	 * 为了输出保持与原本一样,重写了toString
	 */
	@Override
	public String toString() {
		StringBuilder sb =new StringBuilder();
		sb.append("[");
		for(int i=0;i<size;i++) {
			sb.append(elementDate[i]+",");
		} 
		sb.setCharAt(sb.length()-1,']');
		return sb.toString();
	}
	
	public static void main(String[] args) {
		HWArrayList hw=new HWArrayList();
		hw.add("自定义ArrayList");
		hw.add("自定义ArrayList2");
		System.out.println(hw);
	}
	
}

谢谢!!如有不对请联系,我加以改正!!!!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值