HashSet vs. TreeSet vs. LinkedHashSet

版权声明:请附链接,自由转载 https://blog.csdn.net/kangkanglou/article/details/81988190

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

猜你喜欢

转载自blog.csdn.net/kangkanglou/article/details/81988190