Java HashSet和LinkedHashSet

Java HashSet和LinkedHashSet,java,collections,hashset,insertion,linkedhashset,Java,Collections,Hashset,Insertion,Linkedhashset,因此,我正在开发一个程序,需要在其中存储原始类型的唯一客户数据。在这方面,我一直在阅读一本关于数据结构的书,并得出了使用HashSet的结论 现在这本书指出,HashSet比LinkedHashSet具有更快的插入和删除速度。这让我有点困惑。我认为两者之间唯一的区别是LinkedHashSet使用了一些额外的内存,使用LinkedList来保持秩序 有人能详细说明吗?明智地选择数据结构 如果插入顺序对您很重要,则可以使用链接哈希集而不是哈希集。有了这些附加功能,内存或处理器周期可能会受到影响 E

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

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


有人能详细说明吗?

明智地选择数据结构

如果插入顺序对您很重要,则可以使用链接哈希集而不是哈希集。有了这些附加功能,内存或处理器周期可能会受到影响

Edit1: 除了插入顺序之外,需要考虑的因素是:由于Link KHASSET设置了双链接表,插入和删除的速度会慢一些,但是迭代中的速度会稍快一些。p> 引用java文档:


此类提供所有可选的集合操作,并允许空元素。与HashSet类似,它为基本操作(add、contains和remove)提供了恒定的时间性能,假设hash函数在bucket之间正确地分散元素。性能可能略低于HashSet,这是由于维护链表的额外费用造成的,但有一个例外:在LinkedHashSet上的迭代需要与集合大小成比例的时间,而不管其容量如何。对哈希集的迭代可能更昂贵,需要与容量成比例的时间。

明智地选择数据结构

如果插入顺序对您很重要,则可以使用链接哈希集而不是哈希集。有了这些附加功能,内存或处理器周期可能会受到影响

Edit1: 除了插入顺序之外,需要考虑的因素是:由于Link KHASSET设置了双链接表,插入和删除的速度会慢一些,但是迭代中的速度会稍快一些。p> 引用java文档:


此类提供所有可选的集合操作,并允许空元素。与HashSet类似,它为基本操作(add、contains和remove)提供了恒定的时间性能,假设hash函数在bucket之间正确地分散元素。性能可能略低于HashSet,这是由于维护链表的额外费用造成的,但有一个例外:在LinkedHashSet上的迭代需要与集合大小成比例的时间,而不管其容量如何。对哈希集的迭代可能更昂贵,需要与容量成比例的时间。

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

1) 重复项:所有三个工具集接口意味着它们不允许存储重复项

2) 线程安全:HashSet、TreeSet和LinkedHashSet不是线程安全的,如果您在多线程环境中使用它们,其中至少有一个线程修改了设置,您需要对它们进行外部同步

3) Fail-Fast迭代器:TreeSet、LinkedHashSet和HashSet返回的迭代器是Fail-Fast迭代器。i、 e.如果迭代器在创建后以迭代器移除()方法以外的任何方式进行修改,它将尽最大努力抛出ConcurrentModificationException。阅读更多关于fail-fast与fail-safe迭代器的信息

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

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

排序: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,因此这里是一个

TreeSet,Java中的LinkedHashSet和HashSet是集合框架中的三集实现,与其他许多实现一样,它们也用于存储对象。TreeSet的主要特性是排序,LinkedHashSet是插入顺序,HashSet只是用于存储对象的通用集合。HashSet是在Java中使用HashMap实现的,而TreeSet是实现的