java_簡單解析ArrayList_iterable


用java實現棧 和隊列,,並查看java源碼

動態數組容器ArrayList(泛型容器)

1. 對於主要方法,不在這贅述

2. 基本原理

  1. 對於基本原理類似於 動態數組DynamicArray
public class DynamicArray<E> {
    private static final int DEFAULT_CAPACITY = 10;
    private int size;
    private Object[] elementData;
    public DynamicArray(){
        this.elementData = new Object[DEFAULT_CAPACITY];
    }
    
    /** * 首先確保,空間是滿足的 * @param minCapacity */
    private void ensureCapacity(int minCapacity){
        int oldCapacity = elementData.length;
        if (oldCapacity >= minCapacity){
            return;
        }
        int newCapacity = oldCapacity * 2;
        if (newCapacity < minCapacity){
            newCapacity = minCapacity;
        }
        elementData = Arrays.copyOf(elementData,newCapacity);
    }
    public void  add(E e){
        ensureCapacity(size +1);
        elementData[size++] = e;
    }
    public E get(int index){
        return (E)elementData[index];
    }
    public int size(){
        return size;
    }
    public E set(int index,E element){
        E oldValue = get(index);
        elementData[index] = element;
        return oldValue;
    }
}

3. 在ArrayList 的接口 實現 了迭代的接口(Iterable)

  1. 實現了迭代就可以使用更加的簡化的foreach 語法,
  2. iterable 和 iterator 是不一樣的,
    1. Iterable 表示 對象可以被迭代,他有一個方法iterator 返回iterator對象,實際是對iterator接口的方法進行遍歷
    2. 如果對象實現了iterable,就可以創建foreach語法
    3. 類可以不實現iterable ,也可以創建iterator 對象
  3. 迭代的陷進
    1. 就是 不能在迭代的過程中調用容器的刪除方法
      public void remove(ArrayList<Integer> list){
         for(Integer a :list){
          if(a <= 100){
           list.remove(a);
           }
          }
      }
      
    2. 但是如果改成 這樣 ,就不會報錯
             public void remove(ArrayList<Integer> list){
                 for(Integer a :list){
                  if(a <= 100){
                   list.remove();
                   }
                  }
             }
      
    3. ArrayList 的迭代原理
          public ListIterator<E> listIterator(int index) {
              if (index < 0 || index > size)
                  throw new IndexOutOfBoundsException("Index: "+index);
              return new ListItr(index);
          }
      
      
    4. 使用迭代器 表示的是一種關注點分離的思想,將數據的實際組織方式與數據的迭代遍歷相分離,這是一種常見的設計模式

4. ArrayList實現的接口

  1. 三個主要的接口: collection, List, RandomAccess

1. collection

  1. 表示一個數據集合,數據間沒有位置和順序的概念
  2. 主要的方法 可以通過點擊查看源碼,更加有深刻的認識

2. List

  1. 表示有順序或位置的數據集合,它更是擴展了Collection

3. RandomAccess

  1. 這個定義是空的
       public iterface RandomAccess{
    
       }
    
  2. 這種沒有任何代碼的接口在java 中被稱為標記接口,用於聲明類的一種屬性
  3. 這里實現,接口表示,可以隨機訪問,可隨機訪問就是具備類似數組那樣的特性

5. 總結ArrayList

  1. 對於ArrayList 他的特點就是內部采用動態隨機數組實現,
    1. 可以隨機訪問,按照索引位置進行訪問效率高,O(1)
    2. 除非數組已經排序,不然按照內容排序,效率低O(n)
    3. 添加N個元素的效率為O(n)
    4. 插入和刪除元素的效率比較低,因為要移動元素O(n)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM