📜  Java的HashSet 与 TreeSet

📅  最后修改于: 2021-10-27 09:04:55             🧑  作者: Mango

  • 速度和内部实施
    HashSet :用于搜索、插入和删除等操作。这些操作平均需要恒定的时间。 HashSet 比 TreeSet 快。 HashSet 是使用哈希表实现的。

    TreeSet : TreeSet 的搜索、插入和删除的 O(Log n) 比 HashSet 高。但是 TreeSet 保持排序的数据。此外,它还支持诸如higher()(返回最少的更高元素)、floor()、ceiling() 等操作。这些操作在TreeSet 中也是O(Log n),而在HashSet 中不支持。 TreeSet 是使用自平衡二叉搜索树(红黑树)实现的。 TreeSet 由Java的 TreeMap 支持。

  • 订购
    HashSet 中的元素没有排序。 TreeSet 以JavaComparable 或 Comparator 方法定义的 Sorted 顺序维护对象。默认情况下,TreeSet 元素按升序排序。它提供了几种处理有序集合的方法,如 first()、last()、headSet()、tailSet() 等。
  • 空对象
    HashSet 允许空对象。 TreeSet 不允许 null Object 并抛出 NullPointerException,为什么,因为 TreeSet 使用 compareTo() 方法来比较键,并且 compareTo() 会抛出Java.lang.NullPointerException。
  • 比较
    HashSet 使用 equals() 方法比较 Set 中的两个对象并检测重复项。 TreeSet 使用 compareTo() 方法用于相同目的。
    如果 equals() 和 compareTo() 不一致,即对于两个相等的对象,equals 应该返回 true 而 compareTo() 应该返回零,这将破坏 Set 接口的契约,并允许在 Set 实现中重复,例如 TreeSet

如果您想要一个有序的 Set,那么最好将元素添加到 HashSet,然后将其转换为 TreeSet,而不是创建一个 TreeSet 并向其添加元素。

哈希集示例

// Java program to demonstrate working of
// HashSet
import java.util.HashSet;
class HashSetDemo {
    public static void main(String[] args)
    {
  
        // Create a HashSet
        HashSet hset = new HashSet();
  
        // add elements to HashSet
        hset.add("geeks");
        hset.add("for");
        hset.add("practice");
        hset.add("contribute");
  
        // Duplicate removed
        hset.add("geeks");
  
        // Displaying HashSet elements
        System.out.println("HashSet contains: ");
        for (String temp : hset) {
            System.out.println(temp);
        }
    }
}
输出:
HashSet contains: 
practice
geeks
for
contribute

树集示例

// Java program to demonstrate working of
// TreeSet.
import java.util.TreeSet;
class TreeSetDemo {
  
    public static void main(String[] args)
    {
        // Create a TreeSet
        TreeSet tset = new TreeSet();
  
        // add elements to HashSet
        tset.add("geeks");
        tset.add("for");
        tset.add("practice");
        tset.add("contribute");
  
        // Duplicate removed
        tset.add("geeks");
  
        // Displaying TreeSet elements
        System.out.println("TreeSet contains: ");
        for (String temp : tset) {
            System.out.println(temp);
        }
    }
}
输出:
TreeSet contains: 
contribute
for
geeks
practice

何时更喜欢 TreeSet 而不是 HashSet

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

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

3. TreeSet 下面使用红黑树算法对元素进行排序。当需要频繁进行读写操作时,TreeSet 是一个不错的选择。

4. LinkedHashSet 是介于这两者之间的另一种数据结构。它提供像 HashSet 这样的时间复杂度并维护插入顺序(请注意,这不是排序顺序,而是插入元素的顺序)。

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程