当前位置: 首页 > 面试题库 >

Collectors.toConcurrentMap和通过Collectors.toMap供应商选项将地图转换为ConcurrentHashMap有什么区别?

呼延英奕
2023-03-14
问题内容

我想通过Java 8 和接口将a Map转换为ConcurrentHashMapvia ,我可以使用两个选项。Stream``Collector

首先:

Map<Integer, String> mb = persons.stream()
                                 .collect(Collectors.toMap(
                                            p -> p.age, 
                                            p -> p.name, 
                                            (name1, name2) -> name1+";"+name2,
                                            ConcurrentHashMap::new));

第二个:

Map<Integer, String> mb1 = persons.stream()
                                  .collect(Collectors.toConcurrentMap(
                                             p -> p.age, 
                                             p -> p.name));

哪个是更好的选择?什么时候应该使用每个选项?


问题答案:

在处理并行流时,它们之间是有区别的。

toMap ->是非并行收集器

toConcurrentMap ->是并发收集器(这可以从它们的特征中看出)。

区别在于 toMap 将创建多个中间结果,然后将其合并在一起(多次调用该Collector的Supplier),而 toConcurrentMap
将创建 单个 结果,并且每个Thread都会向其抛出结果(此类的Supplier收藏家只会被调用一次)

为什么这很重要?这处理插入顺序(如果有的话)。

toMap 将通过合并多个中间结果按遇到的顺序在结果Map中插入值(该收集器的供应商称为“多次”,也称为“合并器”)

toConcurrentMap
将通过将所有元素扔到公共结果容器(在这种情况下为ConcurrentHashMap)来以任何顺序(未定义)收集元素。供应商仅被调用一次,累加器被调用多次,而合并器则从未被调用。

这里的一个小警告是CONCURRENT收集器不调用合并:流必须具有UNORDERED标志-
通过unordered()显式调用或当流的源未排序时(Set例如)。



 类似资料:
  • 问题内容: 我有一个地图,该地图将同时被多个线程修改。 Java API中似乎有三种不同的同步Map实现: Hashtable Collections.synchronizedMap(Map) ConcurrentHashMap 据我了解,这是一个旧的实现(扩展了过时的类),后来对其进行了修改以适合该Map接口。虽然它是同步的,但似乎存在严重的可伸缩性问题,因此不建议用于新项目。 但是其他两个呢?

  • 我正在寻找编译过程中使用的默认编译器标志。因此,我使用了命令

  • 这两种方法有什么区别:和? 请举个例子。

  • 问题内容: 我知道映射是将键映射到值的数据结构。字典不一样吗?地图和字典1有什么区别? 1.我不是要问用X或Y语言定义它们(这似乎是人们通常在SO上要求的语言),我想知道它们在理论上有何不同。 问题答案: 同一件事的两个术语: Java,C ++使用“地图” .Net,Python使用“字典” PHP使用“关联数组” “映射”是正确的数学术语,但是避免使用它,因为它在函数式编程中具有单独的含义。

  • 问题内容: 下面的示例代码使用bimg将pdf转换为jpeg 。 但只会转换的第1页。 有什么方法可以转换成包含多个页面的图像。 问题答案: bimg使用libvips,并可能加载PDF。不幸的是,libvips加载PDF的默认设置是仅加载一页。除非您想修改bimg(供应商,贡献,破解源代码等),否则您很不幸。 不是问题的答案(不使用bimg),但是您可以改用imagemagick,