Java 调用一个方法n次:我应该使用转换的for-each循环还是传统的for循环?

Java 调用一个方法n次:我应该使用转换的for-each循环还是传统的for循环?,java,for-loop,foreach,premature-optimization,Java,For Loop,Foreach,Premature Optimization,考虑到需要循环到任意int值,将该值转换为数组并对每个数组进行转换是更好的编程实践,还是只使用传统的for循环 仅供参考,我正在计算6面骰子多次投掷的5和6个结果(“命中”)的数量。我的任意int值是表示多次抛出次数的骰子池 据我了解,有两种选择: 将骰子池转换为一个数组,对于每个数组: public int calcHits(int dicePool) { int[] dp = new int[dicePool]; for (Integer a : dp) { // ca

考虑到需要循环到任意int值,将该值转换为数组并对每个数组进行转换是更好的编程实践,还是只使用传统的for循环

仅供参考,我正在计算6面骰子多次投掷的5和6个结果(“命中”)的数量。我的任意int值是表示多次抛出次数的骰子池

据我了解,有两种选择:

  • 将骰子池转换为一个数组,对于每个数组:

    public int calcHits(int dicePool) {
       int[] dp = new int[dicePool];
       for (Integer a : dp) {
         // call throwDice method
       }
    }
    
  • 使用传统的for循环:

    public int calcHits(int dicePool) {
       for (int i = 0; i < dicePool; i++) {
         // call throwDice method
       }
    }
    
    public int-calcHits(int-dicePool){
    for(int i=0;i

  • 我的观点是,选项1是笨拙的代码,涉及到不必要的数组创建,尽管for-each循环比选项2中传统的for循环更有效

    我不会写第一个。没有必要在每个设置中都使用最新的语法

    你的直觉是好的:如果感觉和看起来都很笨拙,那很可能是


    使用#2,晚上睡觉。

    为什么需要分配一个数组来循环一个可以安全地递增和使用而不需要任何分配的变量

    这听起来效率极低。如果需要交换
    ints
    的顺序,则需要分配数组,但实际情况并非如此。我肯定会选择选项2


    当您想要迭代集合时,
    foreach
    非常有用,但是当您不需要集合时,创建一个集合只是迭代它是毫无意义的。

    (2)是一个明显的选择,因为根据您的描述创建数组没有意义。如果有,情况当然会改变。

    此时,速度并不重要(插入过早优化注释;)重要的是你能多快理解代码的作用,也就是调用一个方法
    dicePool

    第一个方法分配一个大小为
    dicePool
    的数组,并迭代其值,这恰好运行循环体
    dicePool
    次(我假设您的意思是
    int
    而不是
    Integer
    ,以避免不相关的自动装箱问题)。对于运行代码的计算机来说,这可能是低效的,但更重要的是,对于阅读代码的人来说,这是低效的,因为从概念上讲,它与您想要实现的目标相去甚远。具体地说,您强制读者考虑您刚刚创建的新数组,以及变量
    a
    的值,对于循环的每次迭代,该值都将为0,即使这两者都与您的最终目标无关

    任何查看第二种方法的Java程序员都会意识到,您正在使用
    i
    dicePool
    执行循环体
    dicePool
    次。虽然后一部分并不特别重要,但开始正是你想要做的。使用这种常见的Java习惯用法可以最大限度地减少读者需要考虑的不相关的事情,因此它是最好的选择


    当有疑问时,要简单是什么让你认为for-each循环更有效

    在集合上迭代很可能比简单的循环和计数器效率低


    如果您提供更多关于这个问题的上下文,特别是这个问题是否比选择一种语法更重要,可能会有所帮助。我在思考一个问题时遇到了困难,而#1将是一个更好的解决方案。

    为什么你认为
    foreach
    for
    更有效?因为每一个都是更新的,我盲目地认为它自然会更有效。另一个假设已经尘埃落定,特别是感谢CrazyJugglerDrummer的回答。从表面上看这个问题,当然,收藏是没有意义的。然而:真正的问题是,为什么要传递原始
    int
    值?你不是有一个由骰子集合组成的
    骰子池吗?在某个时刻,你不想知道他们的
    lasthrow
    结果吗?或者,换句话说,你从哪里得到了你需要的抛出次数?可能来自某种你可以反复浏览的收藏…@yar谢谢你的评论。令人惊讶的是,我没有骰子课。我直接从我想要模拟掷骰子的实体的属性值和技能值中获得所需的掷骰次数。暗影奔跑的机制不需要知道最后的掷骰结果等,只需要知道骰子池的确切大小。我想这是可行的,除非你想检查其中一个骰子是否被加载:)+1,并接受你的答案,关注对人类和非人类的实际后果。这一点很好。我还要添加一个premate-optimization-comment-give-how-popular-and-efficible-groovy-is。你可以放心,这里的东西不多。上下文只不过是为名为Shadowrun的棋盘游戏RPG模拟掷骰子。感谢您的回答和对本能的支持性评论。