如果我有HashSet,并且在某些操作中使用了.filter()流,然后执行.collect(Collectors.toList())操作,那么与将流收集回HashSet .collect(Collectors.toSet())相比,这样做会效率低下吗?
这是否需要与显式地将HashSet转换为List O(n)所需的时间相同,或者Stream是否是一种不同于将元素添加回列表或集合所需时间相同的状态?
数据集非常大。我想要一个列表,因为它消耗更少的内存,但我不想为此牺牲速度。
代码示例示例:
Set<Object> originalSet; // this is a set containing 800,000 Objects
// Scenario 1
List<Object> newList = originalSet.stream().filter(Object::isEnabled).collect(Collectors.toList())
// Scenario 2
Set<Object> newSet = originalSet.stream().filter(Object::isEnabled).collect(Collectors.toSet())发布于 2021-12-01 21:17:14
收集到列表比收集到集合要快。这是因为当收集到一个集合时,对于每个值,它需要找到它的哈希码,并且基于这个哈希代码知道在内存中放置这个值的位置。
所以问题是,我们应该总是收集列表而不是集合?不,这要视情况而定。如果在后面的代码中需要检查该列表或集合中是否存在一个元素,则搜索该集合的速度要快得多。在列表中搜索的复杂度为o(n),而在集合上使用.contains的复杂度仅为o(1)。因此,最后,如果您有使用.contains的代码,则使用该集合,但是如果您只需要稍后迭代它,则使用List。
https://stackoverflow.com/questions/70188859
复制相似问题