Java 如何处理作为递归方法参数的变量?
我想计算xhtml页面上的所有元素。我希望下一个元素以更高的顺序放入HashMap 私有void addComponents(HashMap infos, 列出组件、整数顺序、FacesContext上下文){ } 我有as输出和错误的计数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
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;