如何将数组的大小加倍

Posted

技术标签:

【中文标题】如何将数组的大小加倍【英文标题】:How to double the size of an array 【发布时间】:2014-04-10 17:45:03 【问题描述】:

我必须实现一个从随机生成器中获取元素的数组。每当数组到达它的最后一个元素时,都会调用 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;

【问题讨论】:

【参考方案1】:

设置arr = tmp 不会像您认为的那样做。您只需将resize() 方法中的局部变量arr 指向局部变量tmp。您要做的是返回 tmp 并将其分配给方法外的 arr

if(arr_size==arr.length)
    arr = resize(arr);

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

private static int[] resize(int[] arr) 
    //Resize
    return tmp;

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

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

【讨论】:

【参考方案2】:

试试这个:

    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);
        return tmp;
    

【讨论】:

【参考方案3】:

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

private static void  resize(ref int[] arr)  .... 

然后这样称呼它

resize(ref arr);

【讨论】:

ref 不是有效的 Java。也许你在考虑 C#? 这个问题是关于 Java 编程语言的,但您的答案似乎使用了不同的语言。【参考方案4】:

当您说 New int 时,引用已更改。 Java 使用按引用复制而不是按引用传递,如果您通过 new 更改引用,则调用方方法属性不会有任何更改,在您的情况下有一个返回类型并将其分配回 arr。

【讨论】:

@Kon,刚刚看到并更新了我的答案

以上是关于如何将数组的大小加倍的主要内容,如果未能解决你的问题,请参考以下文章

为啥哈希表扩展通常通过将大小加倍来完成?

使用线性探测实现 Hashtable 时调整大小权衡

在 C++ 中动态调整数组的大小

UITableViewCell 中的 UILabel 将每个 willDisplayCell 的字体大小加倍

在加速中调整大小

在 Web API 响应中添加 zip 文件作为内容,下载时文件大小加倍