HashSet vs. TreeSet vs. LinkedHashSet
Set介面定義集合中沒有重複元素,Java中有3種常用的Set實現:HashSet,TreeSet和LinkedHashSet。什麼時候使用應該使用哪個需要根據實際情況來確認,比如:如果我們期望訪問速度快,那麼我們應該使用HashSet,如果我們需要一個有序集合,那麼應該使用TreeSet, 如果我們想要保留其插入順序,則應該使用LinkedHashSet。
- HashSet:基於雜湊表實現,內部元素無序,基本方法增、刪、判斷是否存在(add, remove, and contains )時間複雜度O(1)。
- TreeSet:基於紅黑樹實現,內部元素有序,基本方法增、刪、判斷是否存在(add, remove, and contains )時間複雜度O(logN)。此外,TreeSet本身還提供實現了first(), last(), headSet(), tailSet()等方法來處理有序集合
- LinkedHashSet:基於雜湊表,同時維護一個內部連結串列以維護元素插入順序,基本方法增、刪、判斷是否存在(add, remove, and contains )時間複雜度O(1)。
TreeSet示例:
插入基礎型別資料
TreeSet tree = new TreeSet();
tree.add(12);
tree.add(63);
tree.add(34);
tree.add(45);
Iterator iterator = tree.iterator();
System.out.print("Tree set data: ");
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
結果輸出:
12 34 45 63
定義物件:
class Dog {
int size;
public Dog(int s) {
size = s;
}
public String toString() {
return size + "";
}
}
插入物件
public class TestTreeSet {
public static void main(String[] args) {
TreeSet dset = new TreeSet();
dset.add(new Dog(2));
dset.add(new Dog(1));
dset.add(new Dog(3));
Iterator<Dog> iterator = dset.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
}
}
編譯沒有問題,但執行會丟擲異常
Exception in thread "main" java.lang.ClassCastException:
collection.Dog cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at collection.TestTreeSet.main(TestTreeSet.java:22)
因為TreeSet內部元素是有序的,所以對於插入到TreeSet中的物件需要實現java.lang.Comparable介面中的compareTo方法
class Dog implements Comparable{
int size;
public Dog(int s) {
size = s;
}
public String toString() {
return size + "";
}
@Override
public int compareTo(Object o) {
return ((Dog) o).size - size;
}
}
或者在TreeSet初始化時指定Comparator
class CatComparator implements Comparator<Cat> {
@Override
public int compare(Cat o1, Cat o2) {
return o1.size - o2.size;
}
}
TreeSet catSet = new TreeSet(new CatComparator());
Cat cat1 = new Cat(1);
Cat cat2 = new Cat(2);
Cat cat3 = new Cat(3);
Cat cat4 = new Cat(4);
catSet.add(cat1);
catSet.add(cat2);
catSet.add(cat3);
catSet.add(cat4);
System.out.println(catSet.size());
相關文章
- Java Set 常用集合 HashSet、LinkedHashSet、TreeSetJava
- HashSet/HashMap、TreeSet/TreeMap、LinkedHashSet/LinkedHashMap 區別HashMap
- java基礎:HashSet/LinkedHashSet/TreeSet — 原始碼分析Java原始碼
- Airflow vs. Luigi vs. Argo vs. MLFlow vs. KubeFlowAIUIGo
- Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及區別Java
- Java集合詳解7:一文搞清楚HashSet,TreeSet與LinkedHashSet的異同Java
- HashSet、TreeSet、CopyOnWriteArraySet和CopyOnWriteArrayList
- 搞懂:資料科學vs.機器學習vs.資料分析vs.商業分析資料科學機器學習
- Ansible vs. TerraformORM
- Navigating Kubernetes Certification: CKAD vs. CKA vs. CKS, Including KCNA and KCSA
- Quarkus vs. SpringBoot - RedditSpring Boot
- Spring WebClient vs. RestTemplateSpringWebclientREST
- 【譯】GraphQL vs. RESTREST
- 大資料檔案格式比較:AVRO vs. PARQUET vs. ORC大資料VR
- 4、Set集合——HashSet、TreeSet(Comparable、Comparator)
- Redis vs. MongoDB比較RedisMongoDB
- Java類集框架 —— HashSet、LinkedHashSet原始碼分析Java框架原始碼
- 柏拉圖洞穴寓言 vs. AI表徵假說 vs. 表觀遺傳AI
- 幽默meme:如何提問題 Vs. 樂觀答題 Vs. 悲觀答題
- 模板 vs. 硬編碼 HTMLHTML
- Ruby on Rails Mountable vs. Full EngineAI
- 軟連結 vs. 硬連結
- Linux vs. Unix:有什麼不同?Linux
- List集合(ArrayList-LinkedList);Set集合(HashSet-TreeSet)
- Apple M1 vs. M1 Pro vs. M1 Max:Apple 的新晶片有多快?APP晶片
- 幽默:網管 vs. 程式設計師程式設計師
- 儲存過程vs.函式QM儲存過程函式
- DevOps vs. Agile有什麼共同點?dev
- 傳統量化策略 VS. AI量化策略AI
- Service Mesh框架對比:Linkerd vs. Istio框架
- machine learning model(algorithm model) .vs. statistical modelMacGo
- [譯] React Native vs. Cordova、PhoneGap、Ionic,等等React Native
- 後端程式設計師一定要看的語言大比拼:Java vs. Go vs. Rus後端程式設計師JavaGo
- 搞懂 HashSet & LinkedHashSet 原始碼以及集合常見面試題目原始碼面試題
- React.memo vs. useMemo: Major differences and use casesReact
- Rust的Vector vs. Golang的Slice比較RustGolang
- 伺服器傳送事件(SSE) vs. WebSockets伺服器事件Web
- 【演算法】轉載:Iterative vs. Recursive Approaches演算法APP