如何加倍数组的大小

Jas*_*son 5 java arrays random resize

我必须实现一个从随机生成器获取其元素的数组.每当数组到达它的最后一个元素时,将调用方法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;}
    }
Run Code Online (Sandbox Code Playgroud)

这是resize():

     private static void  resize(int[] arr) {

    int[] tmp = new int[2*arr.length];
    System.arraycopy(arr,0,tmp,0,arr.length); 
    arr = tmp;
}
Run Code Online (Sandbox Code Playgroud)

Kon*_*Kon 6

设置arr = tmp不符合您的想法.您只需arrresize()方法中的局部变量指向局部变量即可tmp.您要做的是返回tmp并将其分配给arr方法之外.

if(arr_size==arr.length){
    arr = resize(arr);
Run Code Online (Sandbox Code Playgroud)

并将resize()方法签名更改为

private static int[] resize(int[] arr) {
    //Resize
    return tmp;
}
Run Code Online (Sandbox Code Playgroud)

要带走的关键是:当将对象引用传递给Java中的方法时,您将传递该对象引用的副本,该副本可以被视为该对象的内存中的位置的副本.在被调用方法中对此REFERENCE的所有这些操作将不会在该方法之外生效.但是,你可以操纵实际的对象本身,因为正如我所说,引用指向内存中与完全相同的对象相同的位置.

但是,将内存中某个位置的副本更改为指向内存中的新位置不会导致原始调用对象引用指向同一位置


Sta*_*984 1

按照 Kon 的描述设置并返回 tmp 变量,或者arr通过引用传入以使其更改在调整大小函数之外持续存在:

private static void  resize(ref int[] arr) { .... }
Run Code Online (Sandbox Code Playgroud)

并称之为

resize(ref arr);
Run Code Online (Sandbox Code Playgroud)