集合ArrayList的部分功能实现

代码献上:

import java.util.Arrays;

public class ArrayList implements List{
	private Object[] elementData;//底层是一个数组,目前还没有确定长度
	private int size;//不是数组分配了几个空间,而是元素的个数
	
	public ArrayList(){
		//没有指定长度,默认长度为0
		this(4);
		//没有指定长度,长度是0
		//elementData = new Object[]{};
		
	}
	public ArrayList(int initialCapacity){
		//给数组分配指定数量的空间
		elementData = new Object[initialCapacity];
		//指定线性表的元素个数,默认是0
		size=0;
	}
	@Override
	public int size() {
		return size;
	}

	@Override
	public Object get(int i) {
		if(i<0||i>=size){//i<0或者i>=size
			throw new MyArrayIndexIutOfBoundsException("数组索引越界异常:"+i);
		}
		return elementData[i];
	}

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

	@Override
	public boolean contains(Object e) {
		for(int i=0;i<size;i++){
			if(e.equals(elementData[i])){
				return true;
			}
		}
		return false;
	}

	@Override
	public int indexOf(Object e) {
			for(int j=0;j<size;j++){
				if(e.equals(elementData[j])){
					return j;
				}
			}
		return 0;
	}

	@Override
	public void add(Object e) {
		/*
		//数组满了。数组扩容
		if(size==elementData.length){
			grow();
		}
		//给数组赋值
		elementData[size] = e;
		//元素个数加一
		size++;
		//elementData[size++]=e;
		*/
		this.add(size, e);
	}
	private void grow(){
		/*//创建新的数组,长度是数组的2倍
		Object[] newArr = new Object[elementData.length*2];
		//将旧数组的的数据拷贝到新数组中
		for(int i=0;i<size;i++){
			newArr[i] = elementData[i];
		}
		//让elementData指向新数组
		elementData = newArr;
	*/
	elementData = 	Arrays.copyOf(elementData,elementData.length*2);
	
	}

	

	@Override
	public Object remove(int i) {
		if(i<0||i>size){
			throw new MyArrayIndexIutOfBoundsException("数组索引越界异常");
		}	
		System.arraycopy(elementData, i+1, elementData, i,size-(i+1));
		return elementData[i];
	}

	@Override
	public Object set(int i, Object e) {
		if(i<0||i>size){
			throw new MyArrayIndexIutOfBoundsException("数组索引越界异常");
		}	
		elementData[i]=e;
		return elementData[i];
	}
	@Override
	public void add(int i, Object e) {
		//i的位置要正确
		if(i<0||i>size){
			throw new MyArrayIndexIutOfBoundsException("数组索引越界异常:"+i);
		}
		if(size==elementData.length){
			grow();
		}
		//后移i及其后面的元素,从最后一个开始
		for(int j=size;j>i;j--){
			elementData[j] = elementData[j-1];
			
		}
		//给数组第i个位置赋值
		elementData[i] = e;
		size++;
	}
	
	@Override
	public String toString() {
		if(size==0){
			return "[]";
		}
		StringBuilder builder = new StringBuilder("[");
		for(int i=0;i<size;i++){
			if(i!=size-1){
			builder.append(elementData[i]+",");
			}else{
				builder.append(elementData[i]);
				}
			}
		builder.append("]");
		return builder.toString();
	}
	@Override
	public void clear() {
		for(int i=0;i<size;i++){
			elementData[i]=null;
		}
		size=0;
	}
	@Override
	public Object[] toarray() {
		return Arrays.copyOf(elementData, size);
	}
	
}

猜你喜欢

转载自blog.csdn.net/jx1234562/article/details/82693996