我有以下代码:
public int[][][] arrMethod1(){
for (int idx=0;idx< x;idx++ ){
arr[idx]=arrMethod2();
System.out.println("arr "+idx+" is "+Arrays.toString(arr[idx][0]));
}
System.out.println("arr0 are "+Arrays.toString(arr[0][0]));
System.out.println("arr1 are "+Arrays.toString(arr[1][0]));
return arr;
}
当执行这段代码时,在for循环内产生不同的结果,并在外部产生不同的结果。似乎arr[0][0]
与arr[1][0]
相同,在for循环中不是这样。 myMethod()是一个使用2D数组初始化arr[idx]
的方法。对于我的测试,为了简单起见,我使用了1D数组和x=2
。目的是让x
个不同的arr
为3D数组。其余的代码:
private final int[][] arrMethod2(){
final int[] otherArr=arrMethod3();
for (int idz=0;idz< z;idz++ ){
int[] toBe=new int[otherArr.length];
System.arraycopy( otherArr, 0, toBe, 0, otherArr.length );
newArr2[idz]=change(toBe);
}
return newArr2;
}
public int[] arrMethod3(){
for (int idy = 0; idy < y; idy++){
double randomInt = randomGenerator.nextDouble();
newArr3[idy]=(int) Math.round(randomInt);
}
return newArr3;
public MyClass(int x,int y, int z){
this.x=x;
this.y=y;
this.z=z;
this.newArr3 = new int[y];
this.newArr2 = new int[z][y];
this.arr = new int[x][z][y];
}
答案 0 :(得分:1)
如果myMethod
未创建新数组(new int[][]
和new int[]
)但重用相同的内存对象,则会将相同的对象放入arr[0]
和{{ 1}}。总是被新的价值所填补;最后一个覆盖了之前的那些。
答案 1 :(得分:1)
您的代码只创建一次内部数组(newArr3),然后只更改该数组中的值。你需要在每次通话时创建一个新的。
更改您的方法arrMethod3,如下所示:
public int[] arrMethod3(){
int[] retVal = new int[y]; // THIS IS THE IMPORANT LINE
for (int idy = 0; idy < y; idy++){
double randomInt = randomGenerator.nextDouble();
retVal[idy]=(int) Math.round(randomInt);
}
return retVal;
}
您需要对newArr2
(在arrMethod2
中)执行相同操作。
原因是您覆盖了已经传递的值。像这样:
但你需要做的是:
这样,每次调用内部方法时都会有新的数组。
把它想象成一个有房间的房子,每个房间都可以容纳一件事,如果你经过一个房子并在每个房间放一张桌子,然后再次通过相同的房子,用凳子更换桌子;然后最后你将有一个充满凳子的房子。
如果你用书桌填满房子,然后去下一个房子并用凳子填满,你会得到两个不同内容的房子。
(在那个示例房间是你的arrMethod3,房子是arrMethod2,外面的数组是街道)
答案 2 :(得分:0)
只是为了澄清,如果我从你的描述中正确理解,那么在循环arr[0][0] & arr[1][0]
之外是相等的。这意味着即使在循环内部它们也是相等的。但你所说的是不正确的,即arr[0][0] == arr[1][0]
并不意味着arr[0] = arr[1]
,这只是意味着这两个数组的第0个元素是相等的。这是否回答你的问题?还是至少澄清一下?