Java中HashSet和TreeSet之间的区别

Java中的HashSet与TreeSet

首先,我们将看到TreeSet与Java中的HashSet有何不同?

TreeSet 树集

  • TreeSet在java.util包中可用。

  • TreeSet是Set接口的实现类。

  • TreeSet的基础数据结构是Balanced Tree。

  • 在TreeSet中,不保留“元素的插入顺序”,因为元素将按照某种升序排序插入TreeSet中,或者换句话说,“元素的插入顺序”不需要与“检索”相同元素的顺序”。

  • 在TreeSet中,对象仅作为值表示为一组单个元素,作为单个实体。

  • 在TreeSet中,“不允许使用重复的元素”,这意味着无法在TreeSet中插入重复的元素。

  • 在TreeSet中,对于非空集,“不可能插入空”。

  • 在TreeSet中,将空Set设置为第一个元素“可以插入空值”,如果在插入第一个元素后插入null,则不可能或无效。

  • 在TreeSet中,不允许使用“异构对象”,如果强行插入,则会得到异常“ ClassCastException”。

示例

//Java程序演示TreeSet的行为

import java.util.*;

class TreeSetClass {
    public static void main(String[] args) {
        //创建TreeSet的实例
        TreeSet ts = new TreeSet();

        //通过使用add()在TreeSet中添加元素
        ts.add(10);
        ts.add(30);
        ts.add(40);
        ts.add(20);

        /*  ts.add(30); 
                    这里不会有任何异常或错误,但它将被忽略,因为重复无法插入 */

        /*  ts.add(null); 
            在这里我们将得到一个异常NullPointerException
            因为我们要为非空集插入null */

        /*  ts.add("Java"); 
            在这里,我们将获得一个异常ClassCastException
            因为我们要在TreeSet中插入异构对象 */

        //显示当前树集
        System.out.println("Current TreeSet is :" + ts);
    }
}

输出结果

E:\Programs>javac TreeSetClass.java

E:\Programs>java TreeSetClass
Current TreeSet is :[10, 20, 30, 40]

其次,我们将看到HashSet与Java中的TreeSet有何不同?

HashSet 哈希集

  • HashSet在java.util包中可用。

  • HashSet是Set接口的实现类。

  • HashSet是LinkedHashSet的父类。

  • TreeSet的基础数据结构是Hashtable。

  • 在HashSet中,“元素的插入顺序”未保留,或者换句话说,“元素的插入顺序”不需要与“元素的检索顺序”相同。

  • 在HashSet中,对象仅作为值表示为一组单个元素,作为单个实体。

  • 在HashSet中,“不允许使用重复的元素”,这意味着无法在HashSet中插入重复的元素。

  • 在HashSet中,对于非空集和空集,“可以插入null”。

  • 在HashSet中,允许“异构对象”,如果将其强行插入,则不会出现任何异常。

示例

//Java程序演示HashSet的行为

import java.util.*;

class HashSetClass {
    public static void main(String[] args) {
        //创建HashSet的实例
        HashSet hs = new HashSet();

        //通过使用add()方法在HashSet中添加元素
        hs.add(10);
        hs.add(30);
        hs.add(40);
        hs.add(20);

        /*  在这里我们不会出现任何异常,因为在HashSet中可以插入空插入。
        */
        hs.add(null);

        /*  这里不会有任何异常或错误
        但它将被忽略,因为重复插入
        不可能
        */
        hs.add(30);

        /*  在这里我们不会出现任何异常,因为
        对象插入在HashSet中是可能的。
        */
        hs.add("Java");

        //显示当前HashSet-
        System.out.println("Current HashSet is :" + hs);
    }
}

输出结果

E:\Programs>javac HashSetClass.java

E:\Programs>java HashSetClass
Current HashSet is :[null, 20, 40, 10, Java, 30]