栈中pop与peek方法行为不一致问题求解释
行为差异的核心原因
问题出在方法调用的执行顺序,以及栈操作的副作用(pop会修改栈的结构):
在Kotlin/Java这类JVM语言中,调用obj.method(arg)时,会先计算.左侧的目标对象,再计算方法参数。结合栈的特性,两段代码的执行逻辑完全不同:
原代码执行流程
val last = current_stack.pop current_stack.peek.addAll(last)
- 先执行
current_stack.pop:弹出栈顶的集合,赋值给last,此时栈的栈顶变为原来的第二个元素。 - 再执行
current_stack.peek:获取当前栈顶(原第二个集合),调用它的addAll方法,把last(原栈顶集合)的元素添加进去。
重构后代码执行流程
current_stack.peek.addAll(current_stack.pop)
- 先执行
.左侧的current_stack.peek:获取原栈顶的集合(此时还没执行pop,栈结构没变化)。 - 再执行方法参数
current_stack.pop:弹出原栈顶集合,栈的栈顶变为原来的第二个元素。 - 最后调用第一步拿到的原栈顶集合的
addAll方法,传入刚才弹出的集合(也就是它自己)。
这就导致两段代码的操作对象完全不同:
- 原代码是把原栈顶集合的元素,合并到原第二个集合里。
- 重构后代码是把原栈顶集合的元素,合并到它自己里(可能引发重复元素、逻辑异常等问题)。
内容的提问来源于stack exchange,提问作者MrO
相关产品推荐
相关产品推荐

