Java 数组循环行为

标签 java arrays loops

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

根据我在数组中循环的方式,我产生了不同的结果,但我很难理解这一点(我对 Java 还很陌生,但仍然了解如何传递或引用事物)。

测试 1

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

for (int number : array)
{
    number *= 2;
}

导致数组项未修改:

{1, 2, 3, 4}

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


测试 2

我认为通过使用对象数组可能会起作用,假设 number 是对实际数组项的引用。这是我使用 Integer 而不是 int 的测试:

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

for (Integer number : array)
{
    number *= 2;
}

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

{1, 2, 3, 4}

测试 3

经过一番摸索之后,我尝试了一种不同的循环方法,如下所示:

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

for (int i = 0; i < array.length; i ++)
{
    array[i] *= 2;
}

导致数组项成倍增加:

{2, 4, 6, 8}

这个最终结果对我来说很有意义,但我不理解第二次测试(或第一次测试)的结果。直到现在,我一直假设测试 1 和测试 2 中使用的循环只是测试 3 中使用的循环的简写版本,但它们显然不同。

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

最佳答案

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

for (int number : array) {
    number *= 2;
}

类似于:

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

使用 Integer[] 时也会发生同样的情况。

此外,当您在 Iterable 中使用增强的 for 循环时,例如List,它使用迭代器代替。这意味着,像这样的代码:

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

类似于:

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

相关信息:

关于Java 数组循环行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25678416/

相关文章:

java - JSF selectItem 标签格式化

java - 配置 com.sun.xml.ws.transport.http.servlet.WSServletContextListener 类的应用程序监听器时出错

java - 查找两个一维数组的并集、交集和差集

java - 比较 ArrayList 中的元素值

arrays - 在VB6中将图片框图像像素转换为字节数组

loops - 列表中每个项目的 Flutter 调用函数

excel - 如何在 For Next 中应用 Step -1 以相反的顺序循环?

Java正则表达式匹配url中的模式

java - 学习如何在 Java 中创建 RESTful API 的最佳资源是什么?

java - 为什么不打印 "println"消息?