【问题标题】:Initialisation of array of collections not working with for each loop集合数组的初始化不适用于每个循环
【发布时间】:2018-01-11 06:28:36
【问题描述】:

我有一个由四个堆栈组成的数组。我正在使用 foreach 循环对其进行初始化。

Stack s[]=new Stack[4];

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

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

但问题是它打印空。但是当我用普通的for循环替换它时

Stack s[]=new Stack[4];

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

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

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

【问题讨论】:

    标签: java collections foreach


    【解决方案1】:

    这里:

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

    n 是一个局部变量,它引用当前数组元素,而当前值为null
    但是当您将一个新对象分配给n (new 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 元素。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-08-28
        • 1970-01-01
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 1970-01-01
        相关资源
        最近更新 更多