Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在for循环中放置函数调用_Java_Performance - Fatal编程技术网

Java 在for循环中放置函数调用

Java 在for循环中放置函数调用,java,performance,Java,Performance,我有一个这样看起来更干净的函数: public static List<Integer> permuteDigits(int number) { List<Integer> permutations = new ArrayList<>(); for (String s : permutations(String.valueOf(number))) permutations.add(Integer.parseInt(s));

我有一个这样看起来更干净的函数:

public static List<Integer> permuteDigits(int number) {
    List<Integer> permutations = new ArrayList<>();

    for (String s : permutations(String.valueOf(number))) 
        permutations.add(Integer.parseInt(s));

    return permutations;
}
公共静态列表置换(整数){
列表置换=新的ArrayList();
对于(字符串s:排列(String.valueOf(number)))
add(Integer.parseInt(s));
返回置换;
}
但是您可以看到,在for each循环中有一个函数调用。我很确定编译器不会这么做,但是。。。for循环的每次迭代都不会调用该函数,是吗

我几乎可以肯定事实并非如此,但我只是想确定一下。也就是说,上述代码的效率不低于以下代码:

public static List<Integer> permuteDigits(int number) {
    List<String> strPerms = permutations(String.valueOf(number));
    List<Integer> permutations = new ArrayList<>();

    for (String s : strPerms) 
        permutations.add(Integer.parseInt(s));

    return permutations;
}
公共静态列表置换(整数){
列表strPerms=排列(String.valueOf(number));
列表置换=新的ArrayList();
for(字符串s:strPerms)
add(Integer.parseInt(s));
返回置换;
}

对吗?

是的,没错。for each循环中的条件只计算一次。

在第一个代码块中,
置换(String.valueOf(number))
将被调用一次,返回其结果,然后for循环将遍历结果中的元素。如以下示例所示:

static List<Integer> createNumbers() {
    System.out.println("createNumbers");
    return Arrays.asList(0, 1, 2);
}

public static void main(String[] args) {
    for (Integer num : createNumbers()) {
        System.out.println(num);
    }
}
createNumbers
0
1
2