【问题标题】:Java string array initiation in and outside of the loop structure循环结构内外的Java字符串数组初始化
【发布时间】:2011-11-07 08:28:03
【问题描述】:

在下面的代码中

    // Assume there are non-null string arrays arrayA and arrayB 

    // Code 1
    ArrayList<String[]> al = new ArrayList<String[]>();
    String[] tmpStr = new String[2];
    for (int ii = 0; ii < arrayA.length; ii++) {
            tmpStr[0] = arrayA[ii];
            tmpStr[1] = arrayB[ii];
            al.add(ii, tmpStr);
    }

    // Code 2
    ArrayList<String[]> al = new ArrayList<String[]>();

    for (int ii = 0; ii < arrayA.length; ii++) {
            String[] tmpStr = new String[2];
            tmpStr[0] = arrayA[ii];
            tmpStr[1] = arrayB[ii];
            al.add(ii, tmpStr);
    }

代码 2 给出了想要的结果——也就是说,现在 al 的每个索引都包含 {arrayA(ii), arrayB(ii)}。然而,在代码 1 中,al 包含 {arrayA(last_index), arrayB(last_index)} 的所有索引。这是为什么?

【问题讨论】:

    标签: java arrays string arraylist


    【解决方案1】:

    Java 数组是可变的。您的代码多次添加单个数组,并在每次迭代时修改同一个数组。

    【讨论】:

      【解决方案2】:

      在第一个代码块中,您声明了大小为 2 的字符串数组。因此它立即在内存中定义,并且在循环中您将值分配给该引用,因此在每个循环步骤中,它的值都会更改并且它'将被添加到ArrayList 对象中。

      我是第二个代码块,在循环内初始化字符串数组,所以每次它都会在内存中创建新的数组对象,所有对象都会有不同的引用,并添加不同的值,这些引用将传递给ArrayList 对象。

      这就是你在这里得到不同值的原因。

      【讨论】:

        【解决方案3】:

        你可能想在这里画一幅画。

        在这两种情况下,您都有一个包含多个元素的数组。在第一种情况下,al 中的每个数组元素都指向完全相同的对象。这个共享对象(一个二元素数组)的值不断被写入;在代码片段的末尾,它包含分配给它的最后两个值。在后者中,al 中的每个数组元素都指向一个完全不同的对象。这些对象中的每一个都是在循环的不同通道上创建的。

        试试看。画这些图很有启发性。

        【讨论】:

          【解决方案4】:

          在 case1 中,您只会创建 String 数组。看看new 关键字在这两种情况下使用了多少次。在第二种情况下,每次迭代都会在第一种情况下创建几个数组,一次只在数组上创建。

          【讨论】:

            【解决方案5】:

            tmpStr[] 每次都指向您由new String[2]; 创建的同一个数组。每次修改 tmpStr[] 内容时,它都会覆盖之前的值,因为数组是可变的。

            【讨论】:

              【解决方案6】:

              在代码 1 中仅分配一次内存。并在同一内存位置初始化两次的同一内存阵列。 list 包含对该数组的引用。它将始终从该数组位置获取数据,因此它将给出最后初始化的数组 It 。所以我们丢失了第一时间插入的数据。

              但在代码 2 中,两个单独的数组具有不同的内存位置。所以参考是不同的。如此正确的答案。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-05-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-01-17
                • 1970-01-01
                • 2011-12-11
                相关资源
                最近更新 更多