3 回答
TA贡献1788条经验 获得超4个赞
我不确定为什么会发生什么
您正在创建另一个数组,为其他元素提供更多空间。数组在 Java 中具有固定大小;一旦创建,就无法更改。在这里,新数组的长度是旧数组的两倍。然后一个简单的for循环复制元素引用。
这是否意味着 theItems 的大小也翻了一番?
不,数组引用theItems被重新分配给刚创建的新的、更大的数组。
我们不能在不使用 temp 的情况下将 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仍会引用新数组。
TA贡献1942条经验 获得超3个赞
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
TA贡献1810条经验 获得超4个赞
最后要回答你的问题,你可以使用像注释演示的辅助方法,但在某处,必须创建一个单独的新数组并复制所有项目。
数组是一种固定大小的构造——一旦你创建了一个,你就不能就地变大或变小。创建数组时,Java 堆的一部分(这是存储对象的内存区域的术语)等于一项的大小(在本例中为对字符串的引用)乘以数组的长度保留,并且对该内存的引用分配给您在语句左侧指定的变量,如String[] items = new String[10]
.
因此,要items
变大,您必须创建一个所需大小的新数组,按顺序复制所有现有项目,然后将保存较小数组的变量重新分配给较大数组的引用,此时保存在temp
. items = temp;
简单地将引用复制到items
soitems
并temp
引用相同的数组。然后当方法结束时,items
保留 whiletemp
被删除。
此外,由于现在有一个items
没有变量引用的数组(之前提到的),Java 将在其垃圾收集周期中负责清理旧数组。但是,您不必担心数组中的项目会消失,因为您将它们的引用复制到新数组中。
添加回答
举报