首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java的Collectors.toList()和Collectors.toSet()机制

Java的Collectors.toList()和Collectors.toSet()机制
EN

Stack Overflow用户
提问于 2021-12-01 17:42:32
回答 1查看 145关注 0票数 1

如果我有HashSet,并且在某些操作中使用了.filter()流,然后执行.collect(Collectors.toList())操作,那么与将流收集回HashSet .collect(Collectors.toSet())相比,这样做会效率低下吗?

这是否需要与显式地将HashSet转换为List O(n)所需的时间相同,或者Stream是否是一种不同于将元素添加回列表或集合所需时间相同的状态?

数据集非常大。我想要一个列表,因为它消耗更少的内存,但我不想为此牺牲速度。

代码示例示例:

代码语言:javascript
复制
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())
EN

回答 1

Stack Overflow用户

发布于 2021-12-01 21:17:14

收集到列表比收集到集合要快。这是因为当收集到一个集合时,对于每个值,它需要找到它的哈希码,并且基于这个哈希代码知道在内存中放置这个值的位置。

所以问题是,我们应该总是收集列表而不是集合?不,这要视情况而定。如果在后面的代码中需要检查该列表或集合中是否存在一个元素,则搜索该集合的速度要快得多。在列表中搜索的复杂度为o(n),而在集合上使用.contains的复杂度仅为o(1)。因此,最后,如果您有使用.contains的代码,则使用该集合,但是如果您只需要稍后迭代它,则使用List。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70188859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档