我必须实现一个从随机生成器获取其元素的数组。每当数组到达它的最后一个元素时,将调用方法resize()来增加数组的大小。在我的代码中,每个东西都会亮起,直到调用resize()方法,它对数组的大小没有任何影响。它应该增加数组的大小以允许输入更多元素。
for (int j=0; j<arr.length-1; j++) {
random= generator.nextInt(arr.length*4) ;
arr[j]=random;
}
if(arr_size==arr.length){
resize(arr);
for (int h=0; h<(arr.length-1)*2; h++) {
random= generator.nextInt(arr.length*4) ;
arr[h]=random;}
}
这是resize():
private static void resize(int[] arr) {
int[] tmp = new int[2*arr.length];
System.arraycopy(arr,0,tmp,0,arr.length);
arr = tmp;
}
答案 0 :(得分:6)
设置arr = tmp
并不符合您的想法。您只需将arr
方法中的局部变量resize()
指向局部变量tmp
即可。您要做的是返回tmp
并将其分配给方法之外的arr
。
if(arr_size==arr.length){
arr = resize(arr);
并将resize()
方法签名更改为
private static int[] resize(int[] arr) {
//Resize
return tmp;
}
要带走的关键是:当将对象引用传递给Java中的方法时,您将传递该对象引用的副本,该副本可以被视为该对象的内存中的位置的副本。在被调用方法中对此REFERENCE的所有这些操作将不会在该方法之外生效。但是,你可以操纵实际的对象本身,因为正如我所说,引用指向内存中与完全相同的对象相同的位置。
但更改内存中某个位置的副本以指向内存中的新位置不会导致原始调用对象引用指向同一位置
答案 1 :(得分:2)
按照Kon的描述设置并返回tmp变量,或者通过引用传入arr
以使更改保持在resize函数之外:
private static void resize(ref int[] arr) { .... }
并将其称为
resize(ref arr);
答案 2 :(得分:1)
试试这个:
private static int[] resize(int[] arr) {
int[] tmp = new int[2*arr.length];
System.arraycopy(tmp,0,arr,0,arr.length);
System.out.println(tmp.length);
arr = tmp;
return arr;
}
答案 3 :(得分:0)
当您说New int时,引用会更改。 Java使用Copy by Reference并不完全按引用传递,如果您通过new更改引用,则调用方法属性将不会有任何更改,在您的情况下具有返回类型并将其分配回arr。