Java 自创ArrayList

自己实现ArrayList  帮助我们更好的理解ArrayList类的底层结构

import java.util.ArrayList;
import java.util.List;

/**
 * 自己实现一个ArrayList,帮助我们更好的理解ArrayList类的底层结构
 * @author Administrator
 *
 */
public class MyArrayList /*implements List*/{
	private Object[] elementData;//element Data元素 数据
	private int size;
	
	public int size() {
		return size;
	}
	
    //isEmpty类 证容器是否为空
	public boolean isEmpty() {
		return size==0;
	}
	
    //获取数组里该索引的内容
	public Object get(int index) {
		RangeCheck(index);
		return elementData[index]; 
	}
	
    //无参构造器
	public MyArrayList() {
		this(10);
	}
	
    //有参构造器 赋予初始容量
	public MyArrayList(int initialCapacity) {

		//initialCapacity表示初始容量
        
        //如果初始容量<0,则抛出一个异常
		if(initialCapacity<0) {
		try {
			throw new Exception();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
        //创建容器对象
		elementData = new Object[initialCapacity];
	}
	
    //确保容量是否够用,如果不够则要扩容
	private void ensureCapacity() {
		if(size==elementData.length) {
			Object[] newArray = new Object[size*2+1];
			System.arraycopy(elementData, 0, newArray, 0, elementData.length);
			/*for(int i=0;i<elementData.length;i++) {
				newArray[i] = elementData[i]; 
			}*/
			elementData = newArray;
		}
	}
	
    //添加对象
	public void add(Object obj) {
		//如果容量=10了 那么怎么办呢?这时候就需要扩容
		ensureCapacity();
		elementData[size++] = obj;
	}
	
    //在指定索引里添加对象 将后面的数组往后移
	public void add(int index,Object obj) {
		RangeCheck(index);
		//数组扩容和数据地拷贝
		ensureCapacity();
		System.arraycopy(elementData, index, elementData, index+1, size-index);
		elementData[index] = obj;
		size++;
	}
	
    //删除容器中指定索引的对象
	public void remove(int index) {
		//删除指定位置的对象
		RangeCheck(index);
		int numMoved = size-index-1;
		if(numMoved>0)
		System.arraycopy(elementData, index+1, elementData, index,numMoved);
		elementData[--size] = null;
	}
	
    //删除容器中的拥有该内容的对象
	public void remove(Object obj) {
		//return有两个含义:一个返回值,一个结束运行
		for(int i=0;i<size;i++) {
			if(get(i).equals(obj)){
				remove(i);
			}
		}
	}
	
    //在指定索引里修改容器中的对象 与add的区别是不往后移动
	public Object set(int index,Object obj) {
		RangeCheck(index);
		Object OldValue = elementData[index];
		elementData[index] = obj;
		return OldValue;
	}
	
    //检查数组是否越界
	private void RangeCheck(int index) {
		if(index<0||index>=size) {
			try {
				throw new Exception();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
    //测试
	public static void main(String[] args) {
		//List list = new ArrayList();
		MyArrayList list = new MyArrayList(3);
		list.add("333");
		list.add("333");
		list.add("333");
		System.out.println(list.size());
		list.set(2, "222112");
		System.out.println(list.get(2));
	}
}

猜你喜欢

转载自blog.csdn.net/szlg510027010/article/details/81836434
今日推荐