1. 程式人生 > >集合ArrayList的部分功能實現

集合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);
	}
	
}