You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

栈中pop与peek方法行为不一致问题求解释

行为差异的核心原因

问题出在方法调用的执行顺序,以及栈操作的副作用(pop会修改栈的结构):

在Kotlin/Java这类JVM语言中,调用obj.method(arg)时,会先计算.左侧的目标对象,再计算方法参数。结合栈的特性,两段代码的执行逻辑完全不同:

原代码执行流程

val last = current_stack.pop
current_stack.peek.addAll(last)
  1. 先执行current_stack.pop:弹出栈顶的集合,赋值给last,此时栈的栈顶变为原来的第二个元素。
  2. 再执行current_stack.peek:获取当前栈顶(原第二个集合),调用它的addAll方法,把last(原栈顶集合)的元素添加进去。

重构后代码执行流程

current_stack.peek.addAll(current_stack.pop)
  1. 先执行.左侧的current_stack.peek:获取原栈顶的集合(此时还没执行pop,栈结构没变化)。
  2. 再执行方法参数current_stack.pop:弹出原栈顶集合,栈的栈顶变为原来的第二个元素。
  3. 最后调用第一步拿到的原栈顶集合的addAll方法,传入刚才弹出的集合(也就是它自己)。

这就导致两段代码的操作对象完全不同:

  • 原代码是把原栈顶集合的元素,合并到原第二个集合里。
  • 重构后代码是把原栈顶集合的元素,合并到它自己里(可能引发重复元素、逻辑异常等问题)。

内容的提问来源于stack exchange,提问作者MrO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:49:56