我不确定此方法如何工作。据我了解,我们创建了一个临时数组,其大小是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;
}
答案 0 :(得分:5)
我不确定为什么会发生什么
您正在创建另一个数组,为其他元素留出更多空间。数组在Java中具有固定的大小;一旦创建,就无法更改。在这里,新数组的长度是旧数组的两倍。然后,一个简单的for
循环将复制元素引用。
这是否意味着Item的大小也增加了一倍?
否,将数组引用theItems
重新分配给刚创建的更大的新数组。
在不使用临时文件的情况下,我们不能将商品的大小加倍吗?
您可以将theItems
替换为一个新数组,但是随后您丢失了对原始数组的引用,该数组包含您要保留的所有项目,因此没有用。
发生了什么事
初始条件。
theItems -> ["one", "two", "three"]
已创建新数组。
theItems -> ["one", "two", "three"]
temp -> [null , null , null , null, null, null]
已复制项目。
theItems -> ["one", "two", "three"]
temp -> ["one", "two", "three", null, null, null]
已重新分配变量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
中,因此items
和temp
引用同一数组。然后,该方法结束时,items
保留,而temp
被删除。
另外,由于现在有一个数组(以前称为items
),现在没有变量引用,因此Java将在垃圾回收周期中清理旧数组。不过,您不必担心数组中的项会消失,因为您将它们的引用复制到了新数组中。