Java 如何处理作为递归方法参数的变量?

Java 如何处理作为递归方法参数的变量?,java,recursion,Java,Recursion,我想计算xhtml页面上的所有元素。我希望下一个元素以更高的顺序放入HashMap 私有void addComponents(HashMap infos, 列出组件、整数顺序、FacesContext上下文){ } 我有as输出和错误的计数 HashMap: 1000 Start: 1000 return: 1000 Out: 1000 HashMap: 2000 Start: 2000 return: 2000 Out: 2000 HashMap: 3000 Start: 3

我想计算xhtml页面上的所有元素。我希望下一个元素以更高的顺序放入HashMap

私有void addComponents(HashMap infos, 列出组件、整数顺序、FacesContext上下文){

}

我有as输出和错误的计数

HashMap: 1000

Start: 1000

return: 1000

Out: 1000

HashMap: 2000

Start: 2000

return: 2000

Out: 2000

HashMap: 3000

Start: 3000

HashMap: 4000

Start: 4000

return: 4000

Out: 4000

HashMap: 5000

Start: 5000

return: 5000
Out: 5000
HashMap: 6000

Start: 6000

return: 6000

Out: 6000

End: 7000

Out: 3000

HashMap: 4000
同时,下面的方法工作得很好

私有int addComponents(HashMap信息, 列出组件、整数顺序、FacesContext上下文 ) { if((components==null)| | components.isEmpty()) 退货单

  for (UIComponent c : components) {

          order = order + 1000;
          infos.put(c.getClientId(context), order);

      order = addComponents(infos, c.getChildren(), order, context);

  }
  return order;
}


为什么这两个方法的工作方式不同?

您必须记住,Java中的参数赋值不会影响调用方法。因此,当您执行
order=order+1000
时,这不会影响
addComponents
调用实例中
order
的值。通过返回值,您允许调用方将其值更新为递归调用的值


解决这个问题的一个方法是使用一个字段,但是如果您是多线程的,那么您可能会遇到线程安全问题。

第二种方法工作正常,因为递归传递的顺序值已经增加,因此它也反映在递归中

在第一个方法中,按原样传递order值(不首先递增),它按原样将值传递给下一个递归;以同样的方式继续,直到你到达递归的底部,顺序值保持在1000,同样的值被填充到你的map
infos


只有当堆栈展开时,order值才会增加,但是您在
infos
map中放置的值仍然保持不变,尽管
println()
语句可能会让您产生不同的想法。

order值作为addComponents(infos,c.getChildren(),order,context)在每个递归上传递。那么,它不会也反映在被调用的方法中吗?被调用的方法实例获取传入的值。但是,如果被调用实例更新了参数的值,则调用实例不会看到此更新。
  for (UIComponent c : components) {

          order = order + 1000;
          infos.put(c.getClientId(context), order);

      order = addComponents(infos, c.getChildren(), order, context);

  }
  return order;