初始化不适用于每个循环的集合数组

时间:2017-08-03 14:54:05

标签: java collections foreach

我有一个包含四个堆栈的数组。我正在使用foreach循环初始化它。

Stack s[]=new Stack[4];

for(Stack n:s)
{
    n=new Stack();   
}   

System.out.println(s[0]);

但问题是它打印为null。但是当我用正常的循环替换它时

Stack s[]=new Stack[4];

for(int i=0;i<4;i++)
{
    s[i]=new Stack();   
}       

System.out.println(s[0]);

打印[]。我尝试使用其他Java集合LinkedList,ArrayList等,但都具有相同的行为。我的问题是为什么第一种方法不起作用,它曾经在任何地方工作?

2 个答案:

答案 0 :(得分:1)

这里:

for(Stack n:s)
{
    n = new Stack();   
}  

n是一个局部变量,它引用当前数组元素,而当前值为null
但是当您将新对象分配给nnew Stack())时,n不再引用数组元素,而是引用新创建的对象。
新创建的对象最终在每次迭代时被丢弃,当前数组元素保持null

阵列上的这个foreach代码:

for(Stack n : s){
    n = new Stack();   
}   

可以由编译器翻译成这段代码:

for (int i = 0; i < s.length; i++) {
    Stack n = s[i]; // the array element is stored in a local variable
    n = new Stack(); // the n local variable refers to a new Stack object
                     // but is not assigned to s[i]
}

当您使用此语法时:

s[i]=new Stack();   

您明确地将新创建的对象分配给数组的i元素。

答案 1 :(得分:0)

您可以执行以下操作来填充数组。

    Stack s[]=new Stack[4];
    Arrays.setAll(s, i -> new Stack()); 
    System.out.println(s[0]);