所以我开发了一个程序,在这里我需要存储原始类型的独特的客户数据。在这方面,我一直在阅读一本关于数据结构的书,并得出了使用HashSet的结论。
现在这本书说,HashSet比LinkedHashSet具有更快的插入和删除速度。这让我有点困惑。我认为两者之间唯一的区别是,LinkedHashSet使用一些额外的内存,使用LinkedList来保持顺序。
有人能详细说明吗?
发布于 2013-08-27 14:11:14
明智地选择数据结构。
如果插入顺序对您很重要,则可以使用链接Hash集而不是Hash集。有了这些附加特性,内存或处理器周期可能会受到影响。
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-27 14:18:15
Java中的TreeSet、LinkedHashSet和HashSet是集合框架中的三种实现,与许多其他实现一样,它们也用于存储对象。TreeSet的主要特点是排序,LinkedHashSet是插入顺序,HashSet只是存储对象的通用集合。HashSet是在Java中使用HashMap实现的,而TreeSet是使用TreeMap实现的。TreeSet是一个SortedSetimplementation,它允许将元素保持在由可比接口或比较器接口定义的排序顺序中。可比较用于自然顺序排序和对象自定义顺序排序的比较器,这可以在创建TreeSet实例时提供。无论如何,在看到TreeSet、LinkedHashSet和HashSet之间的区别之前,让我们看看它们之间的一些相似之处:
1)重复:这三个实现集接口都意味着它们不允许存储重复项。
2)线程安全: HashSet、TreeSet和LinkedHashSet并不是线程安全的,如果在多线程环境中使用它们,在多线程环境中至少设置了一个线程修改,则需要外部同步它们。
3):TreeSet、LinkedHashSet和HashSet返回的迭代器是故障快速迭代器。也就是说,如果Iterator在创建后通过迭代器remove()方法以外的任何方式被修改,它将尽最大努力抛出ConcurrentModificationException。在这里阅读更多关于故障快速与故障安全迭代器的信息。
现在让我们看看HashSet、LinkedHashSet和TreeSet在Java中的区别:
性能和速度:第一,它们之间的区别在于速度。HashSet是最快的,LinkedHashSet在性能上排在第二位,或者几乎类似于HashSet,但是TreeSet的速度要慢一点,因为它需要对每个插入执行排序操作。TreeSet为添加、删除和包含等常见操作提供了保证的O(log(n))时间,而HashSet和LinkedHashSet提供了恒定的时间性能,例如O(1)用于添加、包含和删除给定的哈希函数,在桶中均匀分布元素。
排序: HashSet不维护任何顺序,而LinkedHashSet则保持元素的插入顺序,就像列表接口一样,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,下面是
https://stackoverflow.com/questions/18467777
复制相似问题