我在进行函数调用时试图找到for-each循环的工作方式。请参阅以下代码,
public static int [] returnArr()
{
int [] a=new int [] {1,2,3,4,5};
return a;
}
public static void main(String[] args)
{
//Version 1
for(int a : returnArr())
{
System.out.println(a);
}
//Version 2
int [] myArr=returnArr();
for(int a : myArr)
{
System.out.println(a);
}
}
在版本1中,我在for-
each循环中调用returnArr()方法,在版本2中,我显式调用returnArr()方法并将其分配给数组,然后对其进行迭代。两种方案的结果都相同。我想知道哪个更有效以及为什么。
我认为版本2会更高效,因为我不会在每次迭代中都调用method。但是令我惊讶的是,当我使用版本1调试代码时,我发现方法调用只发生过一次!
谁能解释 一下它是如何工作的 ?当我为复杂对象编写代码时, 哪个更有效/更好 ?
我不会像以前的答案之一那样从Java语言规范中复制粘贴,而是以可读的格式解释该规范。
考虑以下代码:
for (T x : expr) {
// do something with x
}
如果expr
评估为您所用的数组类型,则语言规范指出所产生的字节码将与以下内容相同:
T[] arr = expr;
for (int i = 0; i < arr.length; i++) {
T x = arr[i];
// do something with x
}
所不同的只是,变量arr
和i
不幸地对您的代码或调试器不可见。这就是开发的原因,第二个版本可能更有用:将返回值存储在调试器可以访问的变量中。
在第一个版本expr
中,函数调用是简单的,而在第二个版本中,您声明了另一个变量并将函数调用的结果分配给该变量,然后将该变量用作expr
。我希望它们在性能上没有可测量的差异,因为第二个版本中的其他变量分配应该由JIT编译器优化,除非您在其他地方使用它。
我试图在for循环中获得for循环,因此输出如下: 我希望输出显示一个正方形 我不知道它为什么不这样做。下面是我的代码:
问题内容: 我很惊讶地看到下面的Java代码片段已编译并运行: 其中listOfNumbers是整数数组。 我以为最终声明只分配了一次。编译器是否正在创建Integer对象并更改其引用? 问题答案: 想象一下,速记看起来很像这样:
For Each循环用于为数组或集合中的每个元素执行语句或一组语句。 For Each循环类似于For循环; 但是,为数组或组中的每个元素执行循环。 因此,步进计数器将不存在于这种类型的循环中。 它主要用于数组或在File系统对象的上下文中使用,以便递归操作。 语法 (Syntax) 以下是VBA中For Each循环的语法。 For Each element In Group [state
我正在尝试将POJO的jackson JSON字符串转换为JSON文件以导入MySQL。 我遇到的问题是,即使我在控制台中返回了JSON字符串,并且。json文件创建后,MySQL workbench抛出一个未处理的错误异常:bool()类型的对象没有长度 作为一个json文件,行为“true”。 如果我做文件被正确导入,但数据库中没有数据,如果被视为json,则只有一行。 我的POJO
问题内容: 以下两个循环之间的性能差异(如果有)是什么? 和 问题答案: 版本1.5中引入的for-each循环通过完全隐藏迭代器或index变量,消除了混乱和出错的机会。结果成语同样适用于集合和数组: 当你看到冒号(:)时,将其读为“ in”。因此,上面的循环读为“对于元素中的每个元素e”。请注意,即使对于数组,使用for-each循环也不会降低性能。实际上,在某些情况下,它可能只比普通的for
问题内容: 我想遍历“节日” 的 ArrayList 并使用 get 方法获取其信息,并打印出其所有值。由于某些原因,当我使用此代码时,它将始终选择第“ 0”个值,而不增加循环。 如果我将值硬编码为“ get(1)”,它将获得正确的值,因此我的问题显然是语法。 问题答案: 造成具体问题的原因是,您将灰心丧气的旧式_脚本_和其后继EL混合在一起。它们不共享相同的变量范围。在中不可用 _scriptl