Java:调整大小方法,有人可以解释吗?

时间:2018-09-19 19:00:11

标签: java arrays resize

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

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

3 个答案:

答案 0 :(得分:5)

  

我不确定为什么会发生什么

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

  

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

否,将数组引用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仍将引用新数组。

答案 1 :(得分:2)

String[] temp = new String[theItems.length*2];创建的Array的大小是theItems的两倍。假设如果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

答案 2 :(得分:2)

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

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

因此,要增大items,必须创建所需大小的新数组,依次复制所有现有项,然后将保存较小数组的变量重新分配给该数组的引用。更大的数组,此时保存在temp中。 items = temp;只需将引用复制到items中,因此itemstemp引用同一数组。然后,该方法结束时,items保留,而temp被删除。

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