手写ArrayList

1.首先编写ExtList接口()

package com.itmayiedu.list;
public interface ExtList<E> {
      public void add(E object);
      public void add(int index, E object);
      public Object remove(int index);
      public boolean remove(E object);
      public int getSize();
      public Object get(int index);
}

2.然后再编写实现类ExtArrayList

package com.itmayiedu.list;
import java.util.Arrays;
public class ExtArrayList<E> implements ExtList<E>{
	//保存ArrayList中数据的数组
	private transient Object[] elementData;
	
	//ArrayList实际数量
	private int size;
	public ExtArrayList(){
		this(10);
	}
     public ExtArrayList(int initialCapacity){
    	 if(initialCapacity<0){
    		 throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
    	 }
    //初始化数组 容量
    	 elementData=new Object[initialCapacity];
     }
     
     //添加  
     public void add(Object object){
    	 //size+1,如果数组容量不够就扩容
    	 ensureExplicitCapacity(size+1);
    	 elementData[size++]=object;
     }
     public void add(int index, E object) {
 		rangeCheck(index);
 		ensureExplicitCapacity(size+1);
 		System.arraycopy(elementData, index, elementData, index+1, size-index);
 		elementData[index]=object;
 		size++;	
 	}
      
     //确保数组的容量充足,扩容
	private void ensureExplicitCapacity(int minCapacity) {
		// 如果存入的数据,超出了默认数组初始容量 就开始实现扩容
    if(size==elementData.length){
    	//获取原来数组的长度为2
    	int oldCapacity=elementData.length;
    	// oldCapacity >> 1 理解成 oldCapacity/2 新数组的长度是原来长度1.5倍
       int newCapacity=oldCapacity+(oldCapacity>>1);
       if(newCapacity<minCapacity){
    	// 最小容量比新容量要小的,则采用初始容量minCapacity
    	   newCapacity=minCapacity;
       }
       elementData = Arrays.copyOf(elementData, newCapacity);
    }		
}

	public Object remove(int index) {
        Object object=get(index);
        int numMoved=elementData.length-index-1;
        if(numMoved>0){
        	System.arraycopy(elementData, index+1, elementData, index,numMoved);
        }
        elementData[--size]=null;
		return object;
	}
	public boolean remove(E object) {
		for(int i=0;i<elementData.length;i++){
			Object element=elementData[i];
			if(element.equals(object)){
				remove(i);
				return true;
			}
		}
		return false;
	}
	public int getSize() {
		return size;
	}
	public Object get(int index) {
       rangeCheck(index);
		return elementData[index];
	}
	private void rangeCheck(int index) {
	if(index>=size){
		throw new IndexOutOfBoundsException("数组越界啦!");
	}		
	}	
}

3.编写测试类TestList

package com.itmayiedu.list;

public class TestList {
 public static void main(String[] args) {
       ExtArrayList<String> extArrayList = new ExtArrayList<String>();
       extArrayList.add("张三");
		extArrayList.add("李四");
		extArrayList.add("王武");
		extArrayList.add(1,"古天乐");
		System.out.println("数组的长度"+extArrayList.getSize());
		System.out.println("获取第一个元素值:" + extArrayList.get(0));
		System.out.println("获取第二个元素值:" + extArrayList.get(1));
		System.out.println("获取第三个元素值:" + extArrayList.get(2));
		System.out.println("获取第四个元素值:" + extArrayList.get(3));		
}
}

手写ArrayList

手写ArrayList