抽象類 介面 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長度,減少擴容操作。