1. 程式人生 > 其它 >java ArrayList

java ArrayList

讓我們來看看ArrayList實現的介面,

實現了Serializable, Cloneable, Iterable, Collection, List, RandomAccess, 下面來講解一下這5個介面的特點吧,

  • Serializable
    • Serializable 是一個標記介面,它用於標記介面類,介面必須由其物件需要持久化的類來實現,序列化就是將一個物件的狀態(各個屬性量)儲存起來,然後在適當的時候再獲得。
  • Cloneable介面的作用
    • cloneable其實就是一個標記介面,只有實現這個介面後,然後再類中重寫Object的clone方法,然後通過類呼叫clone方法才能成功,如果不實現該介面,則會丟擲CloneNoSupportedException(異常不被支援異常)。
  • Iterable
    • 實現此介面允許物件成為進行迭代。 請參閱 For-each 迴圈。
  • Collection
    • 集合層級的根介面,它定義了一組可以重複的物件。
  • List
    • 有序集合(也稱為序列)。可以精確控制每個元素在列表中的插入位置。 使用者可以通過它們的整數索引(在列表中的位置)訪問元素,並在列表中搜索元素。
  • RandomAccess
    • List 實現使用的標記介面來指示它們支援快速隨機訪問。 此介面的主要目的是允許通用演算法改變其行為,以在應用於隨機或順序訪問列表時提供良好的效能。

ArrayList的特點:

  • ArrayList底層使用的是動態陣列,長度固定,預設容量是10。
  • ArrayList可以包含重複元素。
  • 不能直接更改 ArrayList 的大小,可以使用各種新增、插入和刪除方法來間接完成此操作。
  • 新增更多元素時,動態陣列會擴充套件。 所以不需要提前確定大小。
  • 可以快速查詢。 就像陣列一樣,檢索給定索引處的元素需要。
  • ArrayList的缺點:
    • 在動態陣列新增新的元素需要時間,但是如果動態陣列沒有任何空間容納新的條目,它就需要擴充套件,這也需要 O(n)O(n) 時間。
    • ArrayList 執行緒不安全。
    • 昂貴的插入和刪除。 就像陣列一樣,元素彼此相鄰儲存。 因此,在陣列中間新增或刪除專案需要“跳過”其他元素,這需要時間。

細節:

  • 當分配動態陣列時,動態陣列實現會生成一個底層固定大小的陣列。 起始大小取決於實現——假設我們的實現使用 10 個索引。 現在假設我們將 4 個條目附加到我們的動態陣列中。 此時,我們的動態陣列的長度為 4。但底層陣列的長度為 10。
  • 如果我們嘗試追加一項條目,但我們的陣列容量已經滿了怎麼辦?
    • 為了騰出空間,動態陣列會自動建立一個新的、更大的底層陣列。 通常大一倍。
    • 為什麼不直接擴充套件現有陣列? 因為那個記憶體可能已經被另一個程式佔用了。
    • 每個條目都必須單獨複製到新陣列中。