1

所以我正在开发一个程序,我需要存储原始类型的唯一客户数据。在这方面,我一直在阅读一本关于数据结构的书,得出的结论是使用HashSet.

现在这本书指出, a 的HashSet插入和删除速度比 a 快LinkedHashSet。现在这让我有点困惑。我认为两者之间的唯一区别是 aLinkedHashSet使用了一些额外的内存,使用 aLinkedList来保持秩序。

谁能详细说明?

4

2 回答 2

4

明智地选择你的数据结构。

如果插入顺序对您很重要,您可以使用 Linked Hash Set 而不是 Hash Set。借助附加功能,内存或处理器周期可能会受到影响。

Edit1: 除了插入顺序之外要考虑的事情:因为 LinkedHashSet 维护一个双链表,插入和删除会慢一些,但迭代会稍微快一些。

引用 java 文档:

This class provides all of the optional Set operations, and permits null elements. Like HashSet, it provides constant-time performance for the basic operations (add, contains and remove), assuming the hash function disperses elements properly among the buckets. Performance is likely to be just slightly below that of HashSet, due to the added expense of maintaining the linked list, with one exception: Iteration over a LinkedHashSet requires time proportional to the size of the set, regardless of its capacity. Iteration over a HashSet is likely to be more expensive, requiring time proportional to its capacity.

于 2013-08-27T14:11:14.003 回答
4

Java 中的 TreeSet、LinkedHashSet 和 HashSet 是集合框架中的三个 Set 实现,与许多其他集合一样,它们也用于存储对象。TreeSet 的主要特点是排序,LinkedHashSet 是插入顺序,HashSet 只是用于存储对象的通用集合。HashSet 是使用 Java 中的 HashMap 实现的,而 TreeSet 是使用 TreeMap 实现的。TreeSet 是一个 SortedSet 实现,它允许它将元素保持在由 Comparable 或 Comparator 接口定义的排序顺序中。Comparable 用于自然顺序排序, Comparator 用于对象的自定义顺序排序,可以在创建 TreeSet 实例时提供。无论如何,在看到 TreeSet、LinkedHashSet 和 HashSet 之间的区别之前,让我们看看它们之间的一些相似之处:

1) Duplicates :所有三个实现 Set 接口意味着它们不允许存储重复项。

2) 线程安全:HashSet、TreeSet 和 LinkedHashSet 不是线程安全的,如果在多线程环境中使用它们,至少有一个 Thread 修改 Set,则需要外部同步它们。

3)Fail-Fast Iterator:TreeSet、LinkedHashSet、HashSet返回的Iterator都是fail-fast Iterator。即,如果 Iterator 在创建后通过 Iterators remove() 方法以外的任何方式进行了修改,它将尽最大努力抛出 ConcurrentModificationException。在此处阅读有关快速故障与故障安全迭代器的更多信息

现在让我们看看 Java 中的 HashSet、LinkedHashSet 和 TreeSet 之间的区别:

性能和速度:它们之间的第一个区别在于速度。HashSet 最快,LinkedHashSet 在性能上排名第二或几乎与 HashSet 相似,但 TreeSet 稍慢,因为它需要在每次插入时执行排序操作。TreeSet 为添加、删除和包含等常见操作提供有保证的 O(log(n)) 时间,而 HashSet 和 LinkedHashSet 提供恒定的时间性能,例如 O(1) 用于添加、包含和删除给定的哈希函数均匀分布桶中的元素。

排序:HashSet 不维护任何顺序,而 LinkedHashSet 维护元素的插入顺序,很像 List 接口,而 TreeSet 维护排序顺序或元素。

内部实现:HashSet 由 HashMap 实例支持,LinkedHashSet 使用 HashSet 和 LinkedList 实现,而 TreeSet 由 Java 中的 NavigableMap 支持,默认情况下它使用 TreeMap。

null :HashSet 和 LinkedHashSet 都允许 null 但 TreeSet 不允许 null 但 TreeSet 不允许 null 并在将 null 插入 TreeSet 时抛出 java.lang.NullPointerException。由于 TreeSet 使用各个元素的 compareTo() 方法来比较它们,在与 null 比较时抛出 NullPointerException,这里是

于 2013-08-27T14:18:15.270 回答