gpt4 book ai didi

java - 更新 ArrayList 中 Array 的数组元素

转载 作者:行者123 更新时间:2023-12-02 08:43:51 26 4
gpt4 key购买 nike

在下面的代码中,我将 current 数组存储在数组的 ArrayList 中,并且我对 current 数组所做的任何更改都会同时反射(reflect)在 ArrayList 中吗?这是怎么回事?但是在 else block 中,当我用另一个数组初始化 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);
}
}

最佳答案

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

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];

使变量 currentintervals[0] 指向同一对象。因此,当您调用 res.add(current); 时,您会将 current 指向的对象添加到列表中。因此,对 currentintervals[0] 所做的任何更改也将反射(reflect)在存储在列表中的对象中,因为它们是同一个对象。但是,当您将另一个对象分配给 current 时,当您调用 current = Interval; 时,您只是说,current 现在指向同一个对象对象就像 interval 一样。这不会更改 current 指向的原始对象 (intervals[0]) 的属性,current 将只是指向另一个对象。

关于java - 更新 ArrayList 中 Array 的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61213900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com