当前位置: 首页 > 面试题库 >

Java-在循环内或循环外声明变量

帅博简
2023-03-14
问题内容

为什么以下工作正常?

String str;
while (condition) {
    str = calculateStr();
    .....
}

但是据说这是危险的/不正确的:

while (condition) {
    String str = calculateStr();
    .....
}

是否需要在循环外声明变量?


问题答案:

局部变量的范围应始终尽可能小。
在你的例子我相信str是不会使用的外while循环,否则你就不会问这个问题,因为它声明的内部while循环不会是一个选项,因为它不会编译。

所以,既然str是不使用外循环,在尽可能小的范围str是内 while循环。

所以,答案是着重那str绝对应该被while循环内声明。没有,没有,没有,但是。

可能违反此规则的唯一情况是,由于某种原因,每个时钟周期都必须从代码中挤出是至关重要的,在这种情况下,你可能需要考虑实例化外部作用域并重用它而不是在内部范围的每次迭代中重新实例化它。但是,由于java中字符串的不可变性,因此这不适用于你的示例:str的新实例将始终在循环开始时创建,并且必须在循环结束时将其丢弃,因此无法在那里进行优化。

编辑:(将我的评论插入下面的答案中)

在任何情况下,正确的处理方式是正确编写所有代码,为产品建立性能要求,根据该要求评估最终产品,如果不满足要求,则进行优化。通常最终会发生的事情是,你找到了在几个地方提供一些不错的正式算法优化的方法,从而使我们的程序能够满足其性能要求,而不必遍历整个代码库并对其进行调整和修改。为了在这里和那里挤压时钟周期。



 类似资料:
  • 问题内容: 我相信在AS3中,您应该在循环外初始化所有变量,以提高性能。JavaScript也是如此吗?哪个更好/更快/最佳实践? 要么 问题答案: 有 绝对没有区别 意义还是性能,在JavaScript或ActionScript。 是解析器的指令,而 不是 运行时执行的命令。如果在函数体(*)中的任何位置一次或多次声明了特定的标识符,则该标识符在块中的所有使用将引用局部变量。声明是在循环内部,循

  • 问题内容: 在循环内部声明变量是否不好?在我看来,这样做,如下面的第一个代码块所示,将使用第二次的十倍的内存…由于在循环的每次迭代中都创建了一个新的字符串。这样对吗? 与 问题答案: 在循环内部声明变量是否不好? 一点也不!它将变量本地化到其使用点。 在我看来,如下面的第一个代码块所示,这样做将使用十倍于第二个内存的内存。 编译器可以优化内容以保持内存使用效率。仅供参考:如果您使用关键字告诉您变量

  • 问题内容: 我一直想知道,一般而言,在循环之前声明一个扔掉的变量(而不是在循环内部重复)是否会产生(性能)差异?Java中的一个例子(毫无意义): a)循环前声明: b)循环内的声明(反复): a或b哪个更好? 我怀疑重复变量声明(示例b)在理论上会产生更多开销,但是编译器足够聪明,因此无关紧要。示例b的优点是更紧凑,并将变量的范围限制在使用它的地方。尽管如此,我还是倾向于根据示例a进行编码。 问

  • 问题内容: 在Java中,我们不能与另一个具有相同名称的变量在同一作用域中声明一个变量: 语法错误,无法编译。但是,如果我们将其放入循环中: 不产生错误,效果很好。我们基本上是在声明相同的变量。是什么原因?在此背后我不知道/不了解的逻辑是什么? 问题答案: 考虑一下这种方式,在每个循环之后,作用域被“破坏”,变量消失了。在下一个循环中,将创建一个新的作用域,并且可以在该作用域中再次声明该变量。 由

  • 问题内容: ja块变量还是局部变量?我看到j的作用域只是直到for循环结束 问题答案: 局部变量在方法,构造函数或块中声明。 由此可见, 所有块变量都是局部变量。 按照块的定义 块是平衡括号之间的一组零个或多个语句,可以在允许单个语句的任何地方使用。 所以 无论在块内声明什么变量,范围都限于该块。 因此范围仅限于该块内部。那是循环。

  • 问题内容: 我被困在我应该声明一个称为“ phrase”的字符串变量的部分,该变量不应一直循环播放。 让您知道我的任务是:与选项1相似,不同之处在于用户在输入第一队的结果后输入“ N”(而不是“ Q”)。然后,程序输入第二个团队名称及其结果,直到输入“ Q”。输出两个语句,例如选项1中的语句,然后输出第三条语句,该语句说明哪个团队处于第一位(基于点数) 输入样例: 样本输出: 更新 : 我的代码: