抽象類 介面 ArrayList LinkList HashMap

2020-10-29 11:00:30

抽象類

  • 抽象類其實和普通類一樣,只不過多了抽象方法,可以用private修飾變數,但是不能修飾抽象方法,因為抽象方法需要子類繼承它
  • 抽象類裡可以有抽象方法,也可以不寫抽象方法,但是有抽象方法的類一定是抽象類
  • 抽象類不能用來建立物件
  • 不允許使用final和abstract同時修飾一個抽象方法或者抽象類

介面

  • 介面中可以含有變數和方法。但是要注意,介面中的變數會被隱式地指定為 public static final 變數(並且只能是 public static final變數,用 private 修飾會報編譯錯誤)
  • 介面方法會被隱式地指定為 public abstract 方法且只能是 public abstract 方法(用其他關鍵字,比如 private、protected、static、 final 等修飾會報編譯錯誤),並且介面中所有的方法不能有具體的實現
  • 介面中的方法必須都是抽象方法,介面是一種極度抽象的型別,它比抽象類更加"抽象",並且一般情況下不在介面中定義變數。
  • 一個類只能繼承一個抽象類,而一個類卻可以實現多個介面。

ArrayList

  • 查詢、修改、新增(尾部新增)快
  • 刪除、新增(佇列中間)慢
  • 適用於查詢、修改較多的場景。不是執行緒安全的。
  • 底層實現是基於陣列的,因此對指定下標的查詢和修改比較快,但是刪除和插入操作比較慢。
  • 每次新增元素之前會檢查是否需要擴容,每次擴容都是增加原有容量的一半。(擴容是建立一個新的陣列,並將原來的陣列元素遷移到新陣列中)
  • 次對下標的操作都會進行安全性檢查,如果出現陣列越界就立即丟擲異常。

LinkList

  • 雙向連結串列集合。
  • 查詢、修改慢(需要遍歷集合)
  • 新增,刪除快(只需要修改前後節點的連結即可)
  • 適用於新增、刪除較多的場景。
  • 不是執行緒安全的
  • LinkedList根據index查詢時採取的是二分法,即index小於總長度一半時從連結串列頭開始往後查詢,大於總長度一半時從連結串列尾往前查詢。如果是根據元素查詢,則需要從頭開始遍歷

HashMap

  • 結合陣列和連結串列的優勢,期望做到增刪改查都快速
  • 適用於增刪改查所有場景
  • 時間複雜度接近於O(1)
  • 當hash演演算法較好(hash衝突較少)時,增刪改查的時間複雜度都是O(1)。但是如果連結串列較長,則會增加增刪改查的時間複雜度O(連結串列長度)。原則就是儘量減少hash衝突,並預先估算hashmap長度,減少擴容操作。