布尔数组可以在 For 循环中初始化吗?

2022-09-02 09:59:17

刚刚发现这个SO问题恰好解决了我在java中初始化布尔数组初始化布尔数组的问题。但是,虽然它给了我可以工作的代码,但提问者并没有尝试我正在运行的不起作用的代码,我实际上想知道为什么它不起作用。这是我正在尝试的代码:

Boolean[] array = new Boolean[5];
for(Boolean value : array) {
    value = false;
}

这是来自另一个问题的功能代码:

Boolean[] array = new Boolean[5];
Arrays.fill(array, Boolean.FALSE);

我只是好奇为什么for循环方法不起作用?


答案 1
Boolean[] array = new Boolean[5];
for(Boolean value : array) {
    value = false;
}

java 增强的 for 循环使用迭代器来遍历数组。迭代器返回对对象的引用,但 java 按值传递引用,因此您无法更改引用指向的内容,这就是您尝试执行的操作。value = false

EDIT
事实证明,对于普通数组,Java不是转换为a并使用迭代器,而是执行以下操作:List

for (int i = 0; i < array.length; i++) 
{
    Boolean value = array[i]; //here's how we get the value that's referred to 
    ...                       //in the enchanced for loop  
}

虽然我们没有使用迭代器,但Java按值传递引用的事实仍然解释了这里发生的事情。
编辑结束

如果这是具有某些实例成员的对象数组,则可以更改所述成员,但不能更改对象本身引用的内容。

正如其他人所建议的那样,要解决此问题,只需使用常规 for 循环并手动将值分配给数组中的索引槽,即:

Boolean[] b_values = new Boolean[5];
for(int i = 0; i < b_values.length; i++) 
{
    b_values[i] = Boolean.FALSE; 
}

答案 2

代码没有运行的原因是因为当你提到

Boolean[] array = new Boolean[5];
for(Boolean value : array) {
    value = false;
}

您实际上正在创建一个名为“布尔数组”的新引用类型,它仅包含对布尔类的五个对象的引用,但该对象不存在,因为您尚未创建它们。

在第二个代码中

Boolean[] array = new Boolean[5];
Arrays.fill(array, Boolean.FALSE);

您正在使用布尔类的缓存对象,并将其添加到使用 java.util.Arrays 类创建的数组中。布尔值是java中的一个包装类,由于只有两个可能的值可以是true和false,以避免创建它们的开销,java已经为您创建了它们并使其可用于随时使用。