HashSet vs. TreeSet vs. LinkedHashSet

__HelloWorld__發表於2018-08-23

Set介面定義集合中沒有重複元素,Java中有3種常用的Set實現:HashSetTreeSetLinkedHashSet。什麼時候使用應該使用哪個需要根據實際情況來確認,比如:如果我們期望訪問速度快,那麼我們應該使用HashSet,如果我們需要一個有序集合,那麼應該使用TreeSet, 如果我們想要保留其插入順序,則應該使用LinkedHashSet
https://javaconceptoftheday.com/hashset-vs-linkedhashset-vs-treeset-in-java/

  • 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());

相關文章