1. 程式人生 > >java中自己實現一個ArrayList

java中自己實現一個ArrayList

public class MyList<T> implements Iterable<T>{
 /*
  * 設計一種容器:可以不初始化長度,長度可以自動拓展
  */
 private int length = 10;//定義初始化容量大小的變數
 private Object[] arr = new Object[length];//建立陣列用於儲存元素
 private int index = 0;//建立整數索引,用於記錄當前有幾個元素
 public MyList(int length){
  this.length = length;
 }
 public MyList(){}
 //新增元素的方法
 public void add(T obj){
  //如果元素超出了當前陣列的長度,那麼需要擴充套件長度
  if(index>=arr.length){
   //將原本的元素拷貝到新陣列,並且陣列長度增加10
   Object[] newArr = Arrays.copyOf(arr,arr.length+10);
   arr = newArr;
  }
  arr[index++] = obj;//往陣列內新增元素,之後索引自增1
 }
 //獲取元素
 public T get(int index){
  checkIndex(index);
  return (T)arr[index];
 }
 //定義方法,驗證下標
 private void checkIndex(int index){
  if(index>=this.index){
   throw new IndexOutOfBoundsException("下標越界:"+index);
  }
 }
 //刪除方法
 public void remove(int index){
  checkIndex(index);
  Object[] newArr = new Object[arr.length];
  //現將需要刪除的元素的前面的所有元素複製
  System.arraycopy(arr,0,newArr,0,index);
  //複製要刪除元素的後面的所有的元素
  System.arraycopy(arr,index+1,newArr,index,this.index-index-1);
  this.index--;
  arr = newArr;
 }
 //set方法
 public void set(int index,T obj){
  checkIndex(index);
  arr[index] = obj;
 }
 //toString
 public String toString(){
  StringBuilder sb = new StringBuilder();
  sb.append("[");
  for (int i = 0; i < index; i++)
  {
   sb.append(arr[i]);
   if(i < index-1){
    sb.append(",");
   }
  }
  sb.append("]");
  return sb.toString();
 }
 //length
 public int length(){
  return index;
 }
 //addAll
 public void addAll(MyList<T> mm){
  for (int i = 0; i < mm.length(); i++)
  {
   this.add(mm.get(i));
  }
 }
 //toArray
 public Object[] toArray(){
  Object[] res = Arrays.copyOf(arr, index);
  return res;
 }
 //remove
 public void remove(T t){
  for (int i = 0; i < index; i++)
  {
   if(arr[i].equals(t)){
    this.remove(i);
   }
  }
 }
 //removeAll
 public void removeAll(MyList<T> mm){
  for (int i = 0; i < mm.length(); i++)
  {
   this.remove(mm.get(i));
  }
 }
 //insert
 public void insert(int index,T t){
  checkIndex(index);
  //建立新陣列
  Object[] newArr = new Object[arr.length+1];
  //複製將要新增的元素索引的之前的所有元素
  System.arraycopy(arr, 0, newArr, 0, index);
  newArr[index] = t;//將要插入的元素放入新陣列的指定位置
  System.arraycopy(arr, index, newArr,index+1,arr.length-index);
  this.index++;
  arr = newArr;
 }
 @Override
 public Iterator<T> iterator()
 {
  
  Iterator<T> ite = new Iterator<T>()
  {
   int index = 0;
   @Override
   public boolean hasNext()
   {
    if(index<MyList.this.index){
     return true;
    }else{
     return false;
    }
   }