更新 ArrayList 中 Array 的数组元素
Updating array elements of Array in ArrayList
在我下面的代码中,我将 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);
}
}
您的程序的完整示例可能有助于回答您问题的第二部分。中心点是指针引用,current的resign对你问题的第二部分有影响。
数组是指向"integers are located"所在内存的指针。首先,当您将 intervals[0] 添加到 res 列表中时,实际上您是在插入指向同一内存的指针地址。当您 switch/change 当前的值时,它们会反映到 res,因为它们指向相同的内存。你可以把atcurrent[1]=Math.max(second,fourth);
想成:获取数组的地址内存,改变它在位置1的值。此时res中的之前的值更新了,因为地址是一样的。你可以把它想象成一个别名,它们就像通往同一个目标的街道。
您必须考虑到,通过将 intervals[0]
分配给 int[] current
,您实际上并不是在创建新对象。因此,您的字段 current
指向与 intervals[0]
相同的对象。因此,当您调用 res.add(current)
时,您实际上是将存储在 intervals[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]
对于你的第二个问题,如果你的数组初始化如下:
int[][] intervals = new int[size][];
for(int i = 0; i < size; ++i)
intervals[i] = new int[size2];
这意味着您在数组的每个单元格中创建了一个新数组(新对象)。现在。此代码:
int[] current=intervals[0];
使您的变量 current
指向与 intervals[0]
相同的对象。因此,当您调用 res.add(current);
时,您将 current
指向的对象添加到列表中。因此,对 current
或 intervals[0]
所做的任何更改也将反映在存储在列表中的对象中,因为它是同一个对象。但是,当您随后将另一个对象分配给 current
时,当您调用 current = interval;
时,您只是在说,current
现在指向与 interval
相同的对象。这不会改变 current
指向的原始对象的属性 (intervals[0]
),当前将只是指向另一个对象。
在我下面的代码中,我将 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);
}
}
您的程序的完整示例可能有助于回答您问题的第二部分。中心点是指针引用,current的resign对你问题的第二部分有影响。
数组是指向"integers are located"所在内存的指针。首先,当您将 intervals[0] 添加到 res 列表中时,实际上您是在插入指向同一内存的指针地址。当您 switch/change 当前的值时,它们会反映到 res,因为它们指向相同的内存。你可以把atcurrent[1]=Math.max(second,fourth);
想成:获取数组的地址内存,改变它在位置1的值。此时res中的之前的值更新了,因为地址是一样的。你可以把它想象成一个别名,它们就像通往同一个目标的街道。
您必须考虑到,通过将 intervals[0]
分配给 int[] current
,您实际上并不是在创建新对象。因此,您的字段 current
指向与 intervals[0]
相同的对象。因此,当您调用 res.add(current)
时,您实际上是将存储在 intervals[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]
对于你的第二个问题,如果你的数组初始化如下:
int[][] intervals = new int[size][];
for(int i = 0; i < size; ++i)
intervals[i] = new int[size2];
这意味着您在数组的每个单元格中创建了一个新数组(新对象)。现在。此代码:
int[] current=intervals[0];
使您的变量 current
指向与 intervals[0]
相同的对象。因此,当您调用 res.add(current);
时,您将 current
指向的对象添加到列表中。因此,对 current
或 intervals[0]
所做的任何更改也将反映在存储在列表中的对象中,因为它是同一个对象。但是,当您随后将另一个对象分配给 current
时,当您调用 current = interval;
时,您只是在说,current
现在指向与 interval
相同的对象。这不会改变 current
指向的原始对象的属性 (intervals[0]
),当前将只是指向另一个对象。