news 2026/6/10 0:25:29

方法调用时,Java 的及早求值(eager evaluation)策略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
方法调用时,Java 的及早求值(eager evaluation)策略

问题发现:

在写力扣的 70. 爬楼梯 时,写了如下代码:

classSolution{Map<Integer,Integer>map=newHashMap<>();publicintclimbStairs(intn){if(n<=1){// 边界条件:n == 1或者n == 0return1;}intans=0;ans+=map.getOrDefault(n-1,climbStairs(n-1));//ans+=map.getOrDefault(n-2,climbStairs(n-2));map.put(n,ans);returnans;}}
  • 代码使用 map.getOrDefault 函数,我是想完成如下操作:如果存在 key == n-1 or n-2,就直接将其 value 返回,而不进行递归
  • 但是提交之后一直超时

于是,将代码交给了通义千问,并将问题和原因总结如下:

  • 即使n-1已经在map中,climbStairs(n - 1)仍然会被执行(因为 Java 采用 eager evaluation 策略)
  • 所以不能用getOrDefault来实现记忆化递归

eager evaluation 策略

关于 eager evaluation 策略,也是第一回看到这个词,于是让通义总结了一下:

Java 官方文档和语言规范(Java Language Specification, JLS)明确说明了 Java 采用及早求值(eager evaluation)策略,尤其是在方法调用时对参数的处理。

官方依据:Java 语言规范(JLS)

来源:The Java® Language Specification, Java SE 17 Edition(如下图)

Section 15.12.4. Run-Time Evaluation of Method Invocation下的15.12.4.2. Evaluate Arguments

翻译:

参数表达式(如果有的话)将按照从左到右的顺序依次求值。

这意味着:在真正进入方法体之前,所有传入的参数表达式都必须先被完全求值

举例说明

当写:

map.getOrDefault(key,expensiveComputation());

根据 JLS §15.12.4:

  1. JVM 首先计算key的值;
  2. 然后立即调用expensiveComputation()并等待其返回结果
  3. 最后才调用getOrDefault方法,把这两个已经求好值的结果作为参数传进去。

因此,无论key是否存在于 map 中,expensiveComputation()一定会被执行

补充:对比延迟求值(lazy evaluation)

以 computeIfAbsent 为例,它的签名是:

VcomputeIfAbsent(Kkey,Function<?superK,?extendsV>mappingFunction)

注意:第二个参数是一个函数对象(Function,而不是一个值。

  • 你传入的是一个lambda 表达式,它会被包装成一个Function实例。
  • computeIfAbsent内部决定是否调用mappingFunction.apply(key)
  • 如果 key 已存在,它根本不会调用这个函数 —— 这就是延迟求值(lazy evaluation)的体现。

getOrDefault的签名是:

VgetOrDefault(Objectkey,VdefaultValue)

第二个参数是值类型V,所以调用前必须知道这个值是多少 → 必须提前计算。

关于延迟求值(lazy evaluation) ,可以参考这篇文章:Java的Stream API:惰性求值(Lazy Evaluation)与短路操作的性能优势

参考:

[1] 通义千问

[2] 15.12.4. Run-Time Evaluation of Method Invocation

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 4:46:04

2025 MBA必看!10个降AI率工具测评榜单

2025 MBA必看&#xff01;10个降AI率工具测评榜单 2025年MBA必看的降AI率工具测评指南 在人工智能技术飞速发展的今天&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;检测系统正变得越来越精准。对于MBA学生而言&#xff0c;论文、报告乃至商业计划书都可能因AI率过…

作者头像 李华
网站建设 2026/6/10 1:51:55

弧形LED全彩屏明细

弧形LED全彩屏明细&#xff1a;技术解析、应用场景与选型指南在当今追求沉浸式视觉体验的时代&#xff0c;弧形LED全彩屏凭借其独特的造型和卓越的显示效果&#xff0c;已成为舞台演艺、商业展示、高端会议等领域的宠儿。它不仅打破了传统平面显示屏的视觉边界&#xff0c;更能…

作者头像 李华
网站建设 2026/6/10 13:21:57

java数组

1&#xff0c;数组工具类方法&#xff08;1&#xff09;Arrays类sort()静态方法实现对数组的排序&#xff08;2&#xff09;Arrays类的binarySearch()静态方法实现对数组的二分查找//arrs:要查找的数组//fromindex:起始索引//toindex:结束索引//key:要查找的元素值Arrays.binar…

作者头像 李华
网站建设 2026/6/10 13:21:50

携手桂冠电力、南网储能、中能拾贝,TDengine 三项案例入选“星河奖”

12 月 18 日&#xff0c;2025 数据资产管理大会在北京盛大召开&#xff0c;大会现场重磅揭晓了数据智能 “星河&#xff08;Galaxy&#xff09;” 案例评选结果。涛思数据携手广西桂冠电力股份有限公司、中能拾贝科技有限公司、南方电网储能股份有限公司信息通信分公司联合申报…

作者头像 李华
网站建设 2026/6/4 6:42:16

pytorch cuda安装实践:用set_sync_debug_mode,来测试gpu的使用情况

在 CUDA 12.4 环境下&#xff0c;要结合 torch.set_sync_debug_mode() 测试 GPU 使用情况&#xff0c;需先明确该函数的作用&#xff1a;它用于开启 CUDA 同步调试模式&#xff0c;检测异步操作中的错误&#xff0c;搭配现有的设备和线程配置&#xff0c;具体代码如下&#xff…

作者头像 李华
网站建设 2026/5/30 22:09:05

MISC4-图穷匕见

右键属性&#xff0c;查看图片信息&#xff0c;发现画图提示无脑放进随波逐流&#xff0c;查看&#xff08;也可以使用010查看&#xff09;随波逐流提取出图片后面的内容&#xff0c;大串的16进制&#xff0c;转成ASCII看看转换出来时很多坐标&#xff0c;结合图片描述里面的“…

作者头像 李华