Java 处理集合值的复杂性

Java 处理集合值的复杂性,java,collections,complexity-theory,Java,Collections,Complexity Theory,我需要在集合中存储越来越多的对象。在执行集合中每个对象的操作时,我需要定期检查对象是否已存储。如果一个对象尚未存储,我将把它添加到集合的末尾。我在执行检查时迭代地处理每个对象 不应从集合中删除已处理的对象,因为我不希望在再次偶然发现它们时将其重新处理 因此,我不知道什么样的收藏最适合。HashSet有一个常量time contains方法,但是列表有更快的方法来迭代它的元素,对吗 什么是更明智的选择?同时保持两个不同的结构包含相同的节点是否相关,一个用于检查的哈希集和一个用于处理的LinkedL

我需要在集合中存储越来越多的对象。在执行集合中每个对象的操作时,我需要定期检查对象是否已存储。如果一个对象尚未存储,我将把它添加到集合的末尾。我在执行检查时迭代地处理每个对象

不应从集合中删除已处理的对象,因为我不希望在再次偶然发现它们时将其重新处理

因此,我不知道什么样的收藏最适合。HashSet有一个常量time contains方法,但是列表有更快的方法来迭代它的元素,对吗


什么是更明智的选择?同时保持两个不同的结构包含相同的节点是否相关,一个用于检查的哈希集和一个用于处理的LinkedList?

1使用ArrayList,而不是LinkedList。LinkedList消耗大量内存,而且迭代速度比ArrayList慢


2我建议使用两种数据结构。例如,为了使您无法添加到一个集合,您可以通过ConcurrentModificationException对其进行迭代,请使用ArrayList,而不是LinkedList。LinkedList消耗大量内存,而且迭代速度比ArrayList慢

2我建议使用两种数据结构。例如,为了使您无法添加到集合中,请在集合中迭代ConcurrentModificationException

因此,我不知道什么样的收藏最适合。HashSet有一个常量time contains方法,但是列表有更快的方法来迭代它的元素,对吗

来一杯怎么样

哈希表和链表的集合接口实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护一个贯穿其所有条目的双链接列表。此链表定义了迭代顺序,即元素插入到集合插入顺序中的顺序

因此,我不知道什么样的收藏最适合。HashSet有一个常量time contains方法,但是列表有更快的方法来迭代它的元素,对吗

来一杯怎么样

哈希表和链表的集合接口实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护一个贯穿其所有条目的双链接列表。此链表定义了迭代顺序,即元素插入到集合插入顺序中的顺序


嗯,看来你对你的收藏有两种观点感兴趣

类似队列的视图,在末尾添加内容,并在前面检查它们。 支票
所有这些操作在不同类型的堆中都得到了很好的支持,例如java.util.PriorityQueue

嗯,您似乎对集合中的两个视图感兴趣

类似队列的视图,在末尾添加内容,并在前面检查它们。 支票
所有这些操作都在不同类型的堆中得到很好的支持,例如java.util.PriorityQueue

对列表、集合、队列、Deque或映射进行迭代的时间大致相同。@Peter确定吗?这些是接口,它们不能保证它们的实现将提供什么样的复杂性。它们以最简单的方式迭代跳过所有元素。虽然可能没有文档化的guarentes,但您可以自己测试它们,如果您看到它们之间有很大的差异,我会感到惊讶。ArrayList往往是最快的集合,因为所有引用都在线性数组中。但LinkedList和HashSet的顺序是一样的。对列表、集合、队列、数据块或映射进行迭代的时间大致相同。@Peter确定吗?这些是接口,它们不能保证它们的实现将提供什么样的复杂性。它们以最简单的方式迭代跳过所有元素。虽然可能没有文档化的guarentes,但您可以自己测试它们,如果您看到它们之间有很大的差异,我会感到惊讶。ArrayList往往是最快的集合,因为所有引用都在线性数组中。但LinkedList和HashSet.Interest类的顺序相同,但迭代复杂性仍然很高。此外,正如Andrey指出的,我不能在这样的类上使用迭代器,因为我同时添加元素。我可能需要一个可以手动迭代的类。不,迭代的复杂性不高,因为LinkedHashSet维护一个对象的链接列表。这就像在链表中迭代一样昂贵。您仍然可以使用迭代器,将要追加的内容收集到单独的集合中,并在迭代后将其添加到原始集合中。如果您还需要对新元素进行迭代,那么在将它们添加到原始collection.Interest类之前先进行迭代,但迭代的复杂性仍然很高。此外,我不能用我的名字
正如Andrey所指出的,我在添加元素的同时也在添加元素。我可能需要一个可以手动迭代的类。不,迭代的复杂性不高,因为LinkedHashSet维护一个对象的链接列表。这就像在链表中迭代一样昂贵。您仍然可以使用迭代器,将要追加的内容收集到单独的集合中,并在迭代后将其添加到原始集合中。如果您还需要对新元素进行迭代,那么在将它们添加到原始集合之前,请执行此操作。这些操作是在集合接口中定义的,该接口是列表、集合、队列和队列接口的超级接口。因此,很明显,他们得到了支持。我的问题是哪种收集对我来说最有效。这些操作是在收集接口中定义的,它是列表、集合、队列和队列接口的超级接口。因此,很明显,他们得到了支持。我的问题是哪种收集方式对我来说是最有效的。回答不错。谢谢你的ArrayList提示。我担心,虽然这两种结构是处理这个问题的一种相当不雅观的方式。回答得好。谢谢你的ArrayList提示。虽然我担心两种结构是处理这个问题的一种相当不雅观的方式。。