集合ArrayList的部分功能實現
阿新 • • 發佈:2018-12-09
程式碼獻上:
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); } }