【问题标题】:Java: resize method, can someone explain?Java:调整大小方法,有人可以解释吗?
【发布时间】:2019-02-24 00:36:57
【问题描述】:

我不确定这种方法是如何工作的。我的理解是我们创建了一个临时数组,其大小是theItems.length 的两倍(theItems 是另一个数组)。之后,我们将项目复制到 temp 数组,最后我们编写 theItems = temp; (我不确定为什么以及会发生什么)(这是否意味着 theItems 的大小也翻了一番?)。我们不能在不使用 temp 的情况下将 theItems 的大小加倍吗?

private void resize() {
    String[] temp = new String[theItems.length*2];
    for (int i=0 ; i < noOfItems ; i++){
        temp[i]=theItems[i];
    }
    theItems=temp;
}

【问题讨论】:

  • theItems = Arrays.copyOf(theItems, 2*theItems.length);

标签: java arrays resize


【解决方案1】:

String[] temp = new String[theItems.length*2]; 创建一个大小为theItems 两倍的Array。所以说如果theItems{"Hello", "Hi", "Goodbye", "Bye"} 我们就会有

__ __ __ __ __ __ __

作为temp。那么

for(int i=0; i<noOfItems; i++){
    temp[i]=theItems[i];
}

将项目复制到temp。所以我们会有:

"Hello", "Hi", "Goodbye", "Bye" __ __ __ __

(最后四个空格)

然后theItems=temp;theItems 分配给temp。这样,变量theItems 将有四个空格,并且可以添加更多项目。

请注意,Arrays 类已经内置了一个函数来执行此操作:Arrays.copyOf

【讨论】:

  • 但是在我们分配比可用空间更多的项目之前,我们不应该将 theItems 的大小加倍吗?
  • @Zuzu Array 是固定大小的,所以不能直接加倍长度。
【解决方案2】:

我不知道为什么会发生什么

您正在创建另一个数组,为其他元素提供更多空间。数组在 Java 中具有固定大小;一旦创建,就无法更改。在这里,新数组的长度是旧数组的两倍。然后一个简单的for 循环复制元素引用。

这是否意味着 theItems 的大小也增加了一倍?

不,数组引用 theItems 被重新分配给刚刚创建的更大的新数组。

我们不能在不使用 temp 的情况下将 theItems 的大小加倍吗?

您可以将 theItems 替换为一个新数组,但随后您丢失了对包含您要保留的所有项目的原始数组的引用,所以这没有用。

会发生什么:

  1. 初始条件。

    theItems -> ["one", "two", "three"]
    
  2. 已创建新数组。

    theItems -> ["one", "two", "three"]
    
    temp     -> [null , null , null , null, null, null]
    
  3. 复制的项目。

    theItems -> ["one", "two", "three"]
    
    temp     -> ["one", "two", "three", null, null, null]
    
  4. 变量theItems被重新赋值。

    theItems \       ["one", "two", "three"]  <- will be garbage collected.
             |
    temp   --+> ["one", "two", "three", null, null, null]
    

变量temp 将超出范围,但theItems 仍将引用新数组。

【讨论】:

【解决方案3】:

要在最后回答您的问题,您可以使用注释演示的辅助方法,但在某处,必须创建一个单独的新数组并复制所有项目。

数组是一个固定大小的结构——一旦你创建了一个,你就不能让它变大或变小。创建数组时,Java 堆的一部分(用于存储对象的内存区域的术语)等于一项(在本例中为对字符串的引用)的大小乘以数组的长度被保留,并且对该内存的引用分配给您在语句左侧指定的变量,如String[] items = new String[10]

所以要使items 更大,您必须创建一个所需大小的新数组,按顺序复制所有现有项,然后将保存较小数组的变量重新分配给较大数组的引用,当时在temp 举行。 items = temp; 只是将引用复制到 items 中,因此 itemstemp 引用同一个数组。然后当方法结束时,items 仍然存在,而 temp 被删除。

此外,由于现在有一个数组(items 之前提到的)现在没有变量引用,Java 将在其垃圾收集周期中清理旧数组。但是,您不必担心数组中的项目会消失,因为您将它们的引用复制到了新数组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-14
    • 2011-01-16
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多