Java 正在更新ArrayList中数组的数组元素

Java 正在更新ArrayList中数组的数组元素,java,arrays,list,arraylist,pass-by-reference,Java,Arrays,List,Arraylist,Pass By Reference,在下面的代码中,我将current数组存储在数组的ArrayList中,我对current数组所做的任何更改都会同时反映在ArrayList中?这是怎么发生的?但在else块中,当我用另一个数组初始化current数组时,它在ArrayList中不会改变 List<int[]> res=new ArrayList<>(); int[] current=intervals[0]; res.add(current); for(int[] interva

在下面的代码中,我将current数组存储在数组的ArrayList中,我对current数组所做的任何更改都会同时反映在ArrayList中?这是怎么发生的?但在else块中,当我用另一个数组初始化current数组时,它在ArrayList中不会改变

List<int[]> res=new ArrayList<>();
    int[] current=intervals[0];
    res.add(current);
    for(int[] interval:intervals){
        int first=current[0];
        int second=current[1];
        int third=interval[0];
        int fourth=interval[1];
        if(second>=third){
            current[1]=Math.max(second,fourth);
        }
        else{
            current=interval;
            res.add(current);
        }
    }
List res=new ArrayList();
int[]当前=间隔[0];
res.add(当前);
for(int[]间隔:间隔){
int first=当前[0];
int秒=当前[1];
int-third=间隔[0];
int第四=间隔[1];
如果(第二个>=第三个){
当前[1]=数学最大值(第二、第四);
}
否则{
电流=间隔;
res.add(当前);
}
}

完整的程序示例有助于回答问题的第二部分。中心点是指针引用,当前的退出对问题的第二部分有影响


数组是指向“整数所在”内存的指针。首先,当您将间隔[0]添加到res列表中时,实际上是在向同一内存插入指针地址。当您将值切换/更改为当前值时,它们将反映为res,因为它们指向相同的内存。您可以在
current[1]=Math.max(第二、第四)处思考as:获取数组的地址内存并在位置1更改其值。此时,res中的前一个值已更新,因为地址相同。您可以将其视为别名,它们的行为就像通向同一目标的街道。

您必须考虑到,通过将
间隔[0]
指定给
int[]current
,实际上并不是在创建新对象。因此,您的字段
current
指向与
interval[0]
相同的对象。因此,当您调用
res.add(current)
时,实际上是在将存储在
interval[0]
中的数组添加到列表中,并且在
current
字段中所做的任何更改也将在添加到列表中的数组中进行(因为它是同一个对象)。就代码所述,您没有在
else
块中对数组进行任何更改,这可能就是为什么没有可见更改的原因:P.如果您不希望数组更改反映在列表中,则在将数组添加到列表中之前,创建一个新的数组对象并对其进行初始化,例如:

int[] current = new int[intervals[0].length]
for(int i = 0; i < intervals[0].length; ++i)
   current[i] = intervals[0][i]

使变量
成为当前变量
间隔[0]
指向同一对象。因此,当您调用
res.add(当前)时
添加当前对象
指向列表的对象。因此,对
current
interval[0]
所做的任何更改也将反映在列表中存储的对象中,因为它是同一个对象。但是,当您随后将另一个对象指定给
当前
时,当您调用
当前=间隔时
您刚才说的是,
current
现在指向与
interval
相同的对象。这不会改变原始对象的属性
current
指向(
interval[0]
),current将只指向另一个对象。

interval似乎是int数组,因为作者可以执行
for(int[]interval:interval)
是,但他并没有通过该赋值创建新对象,对吧,我的意思是你的行
current[I]=interval[I]
不会编译我知道我在if块中对同一对象进行更改,这就是为什么当前数组在列表中更改。但在else块中,当我用另一个数组更新列表中存储的当前数组时,为什么列表中的当前数组没有更改?你知道,当我更新当前数组并用另一个数组初始化它时,这也是当前数组中的更改,应该会反映在列表中。@AmanDhaka我更新了我的答案,检查它并询问我是否不够清楚:PI获取我正在对if块中的同一对象进行更改,这就是当前数组在列表中更改的原因。但在else块中,当我用另一个数组更新列表中存储的当前数组时,为什么列表中的当前数组没有更改?你知道,当我更新当前数组并用另一个数组初始化它时,这也是当前数组中的更改,应该反映在列表中。我知道我正在if块中的同一对象上进行更改,这就是当前数组在列表中更改的原因。但在else块中,当我用另一个数组更新列表中存储的当前数组时,为什么列表中的当前数组没有更改?您知道,当我更新当前数组并使用另一个数组初始化它时,这也是当前数组中的更改,应该反映在列表中。在else块中,当您使用interval更新当前数组时,您将当前引用切换到另一个“地址”。这意味着您正在将interval的地址值写入current。之前放入列表中的res值不会更新,因为您不会更改其值,但会在其中放入一个新值。Res将有另一个参考加上前一个参考。IDE中的调试视图可以帮助您更好地理解正在发生的事情,本文可以帮助您更好地理解这些事情,谢谢。现在我明白了。
int[][] intervals = new int[size][];
for(int i = 0; i < size; ++i)
   intervals[i] = new int[size2];
int[] current=intervals[0];