2017-08-03 55 views
2

我有一个四个栈的数组。我正在使用foreach循环来初始化它。对每个循环都不起作用的集合数组的初始化

Stack s[]=new Stack[4]; 

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

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

但是,这个问题是它打印空。但是,当我用普通环代替它时

Stack s[]=new Stack[4]; 

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

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

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

回答

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元素。

0

你可以这样做来填充你的数组。

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