2017-08-03 22 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]);