Java Array循环行为

Dar*_*ian 5 java arrays loops

我一直在测试一些不同的方法来将数组项与常数相乘.

我已经产生了不同的结果,这取决于我如何遍历数组并且我无法理解这一点(我对Java很新,并且仍然关注事物的传递或引用).

测试1

int[] array = {1, 2, 3, 4};

for (int number : array)
{
    number *= 2;
}
Run Code Online (Sandbox Code Playgroud)

导致未修改的数组项:

{1, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)

它似乎number不是实际的数组项,而是一个int用它的值初始化的新项.那是对的吗?


测试2

我认为通过使用一个Object数组可能会起作用,假设它number是对实际数组项的引用.以下是我使用的测试Integer而不是int:

Integer[] array = {1, 2, 3, 4};

for (Integer number : array)
{
    number *= 2;
}
Run Code Online (Sandbox Code Playgroud)

同样,导致数组项未经修改:

{1, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)

测试3

经过一些头部刮擦后,我尝试了一种不同的循环方法,如下所示:

int[] array = {1, 2, 3, 4};

for (int i = 0; i < array.length; i ++)
{
    array[i] *= 2;
}
Run Code Online (Sandbox Code Playgroud)

导致数组项成倍增加:

{2, 4, 6, 8}
Run Code Online (Sandbox Code Playgroud)

这个最终结果对我来说很有意义,但我不理解第二次测试的结果(或者第一次测试的结果).到目前为止,我一直认为测试1和2中使用的循环只是测试3中使用的循环的简写版本,但它们明显不同.

为什么这不像我预期的那样工作?为什么这些循环不同?

Lui*_*oza 6

这是因为增强型for循环使用数组中值的副本.代码在

for (int number : array) {
    number *= 2;
}
Run Code Online (Sandbox Code Playgroud)

类似于:

for(int i = 0; i < array.length; i++) {
    int number = array[i];
    number *= 2;
}
Run Code Online (Sandbox Code Playgroud)

使用时也是如此Integer[].

此外,当您forIterable例如使用增强循环时List,它会使用迭代器.这意味着,像这样的代码:

List<Integer> intList = new ArrayList<>();
intList.add(1);
intList.add(2);
intList.add(3);
intList.add(4);
for(Integer i : intList) {
    i *= 2;
}
Run Code Online (Sandbox Code Playgroud)

类似于:

for(Iterator<Integer> it = intList.iterator(); it.hasNext(); ) {
    Integer i = it.next();
    i *= 2;
}
Run Code Online (Sandbox Code Playgroud)

相关信息: