萌新 手写 ArrayList

接口:

package com.zhuzhu.arraylist;

  
/**  
* <p>Title: ZhuzhuList</p>  
* <p>Description: 自定义List接口</p>  
* @author zhuzhu  
* @date 2018年8月12日  
*/  
public interface ZhuzhuList<E> {
	
	/**
	 * 返回List包含元素的个数
	 */
	int size();
	/**
	 * 添加元素
	 */
	void add(E e);
	
	/**
	 * 在index 添加元素
	 */
	
	void add(int index,E e);
	
	
	/**
	 * 安坐标删除元素
	 */
	void remove(int index);
	
	/**
	 * 安坐标获取元素 
	 */
	E get(int index);
	
	/**
	 * 判断List是否为空 
	 */
	boolean isEmpty();
	
	/**
	 * 清空数组
	 */
	void clear();
	
}

实现类

package com.zhuzhu.arraylist;

public class ZhuzhuArrayList<E> implements ZhuzhuList<E> {
	/**
	 * 默认数组大小
	 */
	private static final int DEFAULT_CAPACITY=10;
	
	/**
	 * 存数据的数组
	 */
	private Object[] elementData;
	
	/**
	 * 默认容量的空数组
	 */
	private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA= {};
	
	/**
	 * 数组的大小
	 */
	private int size;
	
	
	public ZhuzhuArrayList() {
		this.elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
	}
	
	
	@Override
	public int size() {
		return this.size;
	}

	@Override
	public void add(E e) {
		ensureCapacityInternal(size+1);
		this.elementData[size++]=e;
	}
	
	@Override
	public void add(int index, E e) {
		if(index<0 || index>size) {
			throw new IndexOutOfBoundsException("请您输入正确的index");
		}
		//扩容
		ensureCapacityInternal(size+1);
		//移动数目
		int numMove=size-index-1;
		//移动
		System.arraycopy(elementData, index, elementData, index+1, numMove+1);
		//赋值
		this.elementData[index]=e;
		size++;
	}
	
	//确定内部容量
	private void  ensureCapacityInternal(int minCapacity) {
		//初始化扩容
		if(this.elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
			minCapacity=DEFAULT_CAPACITY;
		}
		ensureExplicitCapacity(minCapacity);
	}
	
	//确认扩容
	private	void ensureExplicitCapacity(int minCapacity) {
		
		if(elementData.length<minCapacity) {
			grow(minCapacity);
		}
	}
	
    //扩容
	private void grow(int minCapacity) {
		
		int oldCapacity=elementData.length;
		//扩容1.5倍
		int newCapacity=elementData.length+(oldCapacity>>1);
		
		//第一次
		if(newCapacity<minCapacity) {
			newCapacity=minCapacity;
		}
		//扩容 arraycopy(Object src,  int  srcPos,Object dest, int destPos, int length);
		Object[] array=new Object[newCapacity];
		//扩容
		System.arraycopy(elementData, 0, array, 0, elementData.length);
		this.elementData=array;
	}


	@Override
	public void remove(int index) {
		rangeCheck(index);
		
		//移动的距离
		int numMove=size-index-1;
		//移动
		System.arraycopy(elementData, index+1,elementData, index, numMove);
		
		this.elementData[--size]=null;
		
	}

	
	@SuppressWarnings("unchecked")
	@Override
	public E get(int index) {
		
		rangeCheck(index);
		return (E) elementData[index];
	}
	
	private void rangeCheck(int index) {
		if(index<0 || index>=size) {
			throw new IndexOutOfBoundsException("请您输入正确的index");
		}
    }
	

	@Override
	public boolean isEmpty() {
		 
		return size==0;
	}

	@Override
	public void clear() {
		
		for(int i=0;i<size;i++) {
			this.elementData[i]=null;
		}
		this.size=0;
	}
 

}

猜你喜欢

转载自blog.csdn.net/qq_34125999/article/details/81608163