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

ConcurrentHashMap JDK 8何时使用computeIfPresent

易刚捷
2023-03-14
问题内容

jdk 8的并发哈希图的新版本具有两个新方法。

computeIfAbsent

computeIfPresent

putIfAbsent- 旧方法

我了解 putIfAbsentcomputeIfAbsent 的用例。但是我不确定何时将使用 computeIfPresent
。另外,如果我现在有computeIfPresent,为什么还需要putIfAbsent。 putIfAbsent会创建该值的至少一个额外实例。

是仅具有向后兼容性的原因吗?


问题答案:

如另一个答案中所述:即使引入了新的,更“强大”的方法,也将始终保留方法以实现向后兼容。

关于的用例computeIfPresent:可能很难找到一个足够小的示例,以至于看起来不那么虚构并且仍然令人信服。通常,此方法的目的是以任何形式
更新 现有值。

一个示例可能是(受约束的) 单词计数
:对于一组给定的单词,一个单词0在地图中存储了一个初始计数。然后,处理一系列单词:每当从初始集合中找到一个单词时,其计数就会增加1:

import java.util.LinkedHashMap;
import java.util.Map;

public class ComputeIfPresentExample 
{
    public static void main(String[] args) 
    {
        Map<String, Integer> wordCounts = new LinkedHashMap<String, Integer>();

        String s = 
            "Lorem ipsum dolor sit amet consetetur iam nonumy sadipscing " + 
            "elitr, sed diam nonumy eirmod tempor invidunt ut erat sed " + 
            "labore et dolore magna dolor sit amet aliquyam erat sed diam";

        wordCounts.put("sed", 0);
        wordCounts.put("erat", 0);

        for (String t : s.split(" "))
        {
            wordCounts.computeIfPresent(t, (k,v) -> v+1);
        }
        System.out.println(wordCounts);
    }
}

(当然,类似的事情可以用不同的方式解决,但这是以一种或另一种形式出现的一项相当频繁的任务,而新方法可以提供一种简洁而优雅的解决方案)



 类似资料:
  • 问题内容: 我一直在nodejs中编程,研究了如何同时使用socket.io和对节点服务器的ajax调用。socket.io是否设计为替代ajax?我很好奇,在哪种情况下使用socket.io更好,而哪种ajax更好。感谢您的输入。 问题答案: 好吧,Web套接字(通过socket.io)提供的主要内容之一就是ajax缺乏的是服务器推送。因此,对于ajax,如果您想了解服务器上的新事件(例如,另一

  • 我和我的团队一直在使用Spring boot开发一系列微服务。由于服务经历了JUnit和Spring Boot升级(我们现在使用的是Spring Boot 2和JUnit 5),不同开发人员实现的不同JUnit现在使用不同的模式: @扩展为 今天,它们之间的区别是什么?我们真的需要它们来进行单元测试还是嵌入到一些新的Spring Boot注释中?

  • 问题内容: 我得到了asyncio在Python 3.5 中使用的流程,但是我还没有看到关于我应该使用什么东西,我不应该使用的await东西或者它在哪里容易出现的描述。我是否仅需要根据“这是IO操作并应进行await编辑” 来做出最好的判断? 问题答案: 默认情况下,所有代码都是同步的。你可以使用使其异步定义函数,async def并使用来“调用”这些函数await。一个更正确的问题是“什么时候应

  • 问题内容: 我感觉好像总是被教导要使用s,并且我经常看到它们与s 混合使用,以在应该在不同页面上执行相同操作的几段代码中完成相同类型的查询。开始: 那就是我正在从事的工作: 我看到很多像: 似乎LEFT也可能是INNER,有没有抓住的机会? 问题答案: 有收获吗?是的-左联接是外联接的一种形式,而内联接是内联接的一种形式。 这是显示差异的示例。我们将从基本数据开始: 在这里,我们将看到内部联接和左

  • 问题内容: 定制JPA映射器类具有以下方法: 如果我正确理解clear(),它将从上下文中删除所有持久性实体。-资源 但是,我也在这里阅读, 关于何时调用clear()的明确准则是什么? 问题答案: 文章对此进行了解释。清除实体管理器将清空其关联的缓存,从而迫使新的数据库查询在事务中稍后执行。使用事务绑定的实体管理器时,几乎几乎不需要清除实体管理器。我看到有两个原因需要清除: 在进行批处理时,为了

  • 我编写jUnit测试用例有3个目的: 确保我的代码满足所有(或大部分)输入组合/值下所需的所有功能。 以确保我可以更改实现,并依靠JUnit测试用例来告诉我,我的所有功能仍然得到满足。 作为我的代码处理的所有用例的文档,并作为重构的规范--如果需要重写代码的话。(重构代码,如果我的jUnit测试失败--您可能错过了一些用例)。 我不明白为什么或者什么时候应该使用。当我看到被调用时,它告诉我,我的j

  • 自定义JPA映射器类有一个方法: 如果我正确理解clear(),它将从上下文中删除所有持久实体-来源 然而,我也在这里读到, 关于何时调用 clear() 的明确准则是什么?

  • 我正在阅读OracleDocGenericmethod中的泛型方法。当它说什么时候使用通配符和什么时候使用泛型方法时,我对比较感到很困惑。引用文档。 我们本可以在这里使用通用方法: [...]这告诉我们类型参数正被用于多态;它的唯一作用是允许在不同的调用站点使用各种实际的参数类型。如果是这样的话,应该使用通配符。通配符旨在支持灵活的子类型,这就是我们在这里试图表达的。 我们不觉得像《代码》(Col