速度和内部实现

HashSet:用于搜索,插入和删除等操作。这些操作平均需要花费固定时间。 HashSet比TreeSet快。HashSet是使用哈希表实现的。
TreeSet:TreeSet以O(Log n)进行搜索,插入和删除,该值高于HashSet。但是TreeSet保留排序的数据。此外,它支持诸如high()(返回最低的较高元素),floor(),ceiling()等操作。这些操作在TreeSet中也是O(Log n),在HashSet中不受支持。 TreeSet是使用自平衡二进制搜索树(红黑树)实现的。 TreeSet由Java中的TreeMap支持。

排序方式

HashSet中的元素未排序。 TreeSet按照Java中的Comparable或Comparator方法定义的排序顺序维护对象。默认情况下,TreeSet元素以升序排序。它提供了多种方法来处理有序集,例如first(),last(),headSet(),tailSet()等。

空对象

HashSet允许空对象。 TreeSet不允许null对象并抛出NullPointerException,为什么,因为TreeSet使用compareTo()方法比较键,而compareTo()会抛出java.lang.NullPointerException。

比较方式

HashSet使用equals()方法比较Set中的两个对象并检测重复项。 TreeSet使用compareTo()方法实现相同目的。
如果equals()和compareTo()不一致,即对于两个相等的对象,equals应该返回true,而compareTo()应该返回零,这将打破Set接口的协定,并允许在Set实现中重复使用,例如TreeSet。

如果要排序的Set,最好将元素添加到HashSet中,然后将其转换为TreeSet,而不是创建TreeSet并向其中添加元素。

HashSet示例

/ Java program to demonstrate working of 
// HashSet 
import java.util.HashSet; 
class HashSetDemo { 
    public static void main(String[] args) 
    { 

        // Create a HashSet 
        HashSet<String> hset = new HashSet<String>(); 

        // add elements to HashSet 
        hset.add("google"); 
        hset.add("for"); 
        hset.add("practice"); 
        hset.add("contribute"); 

        // Duplicate removed 
        hset.add("google"); 

        // Displaying HashSet elements 
        System.out.println("HashSet contains: "); 
        for (String temp : hset) { 
            System.out.println(temp); 
        } 
    } 
}

运行结果如下:

HashSet contains: 
practice
google
for
contribute

TreeSet示例

// TreeSet. 
import java.util.TreeSet; 
class TreeSetDemo { 

    public static void main(String[] args) 
    { 
        // Create a TreeSet 
        TreeSet<String> tset = new TreeSet<String>(); 

        // add elements to HashSet 
        tset.add("google"); 
        tset.add("for"); 
        tset.add("practice"); 
        tset.add("contribute"); 

        // Duplicate removed 
        tset.add("google"); 

        // Displaying TreeSet elements 
        System.out.println("TreeSet contains: "); 
        for (String temp : tset) { 
            System.out.println(temp); 
        } 
    } 
}

运行结果如下:

TreeSet contains: 
contribute
for
google
practice

什么时候使用TreeSet而不使用HashSet?

  1. 需要排序的唯一元素而不是唯一元素。 TreeSet给定的排序列表始终按升序排列。

  2. TreeSet比HashSet具有更大的局部性。如果两个条目按顺序靠近,则TreeSet将它们在数据结构中并因此在内存中彼此靠近放置,而HashSet则将条目分布在整个内存中,而不管它们与之关联的键如何。

  3. TreeSet在下面使用Red-Black树算法对元素进行分类。 当需要频繁执行读/写操作时,TreeSet是一个不错的选择。

  4. LinkedHashSet是这两者之间的另一个数据结构。 它提供类似于HashSet的时间复杂性,并保持插入顺序(请注意,这不是排序顺序,而是元素插入的顺序)。

欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:Hashset与Treeset的区别
本文链接:https://www.vsdiffer.com/vs/hashset-vs-treeset.html
免责声明:以上内容仅是站长个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。