- 速度和内部实施
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 现场工作专业课程和学生竞争性编程现场课程。