猿问

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

我不确定这种方法是如何工作的。我的理解是我们创建了一个临时数组,其大小是theItems.length(theItems 是另一个数组)的两倍。之后,我们将项目复制到临时数组,最后我们写 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;

}


人到中年有点甜
浏览 185回答 3
3回答

尚方宝剑之说

我不确定为什么会发生什么您正在创建另一个数组,为其他元素提供更多空间。数组在 Java 中具有固定大小;一旦创建,就无法更改。在这里,新数组的长度是旧数组的两倍。然后一个简单的for循环复制元素引用。这是否意味着 theItems 的大小也翻了一番?不,数组引用theItems被重新分配给刚创建的新的、更大的数组。我们不能在不使用 temp 的情况下将 theItems 的大小加倍吗?您可以只theItems用一个新数组替换,但随后您就丢失了对包含要保留的所有项目的原始数组的引用,因此这没有用。这是发生的事情:初始条件。theItems -> ["one", "two", "three"]已创建新阵列。theItems -> ["one", "two", "three"]temp&nbsp; &nbsp; &nbsp;-> [null , null , null , null, null, null]已复制项目。theItems -> ["one", "two", "three"]temp&nbsp; &nbsp; &nbsp;-> ["one", "two", "three", null, null, null]变量theItems被重新分配。theItems \&nbsp; &nbsp; &nbsp; &nbsp;["one", "two", "three"]&nbsp; <- will be garbage collected.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|temp&nbsp; &nbsp;--+> ["one", "two", "three", null, null, null]该变量temp将超出范围,但theItems仍会引用新数组。

手掌心

String[] temp = new String[theItems.length*2];创建Array两倍大小的theItems. 所以说如果theItems是{"Hello", "Hi", "Goodbye", "Bye"}我们就会有__ __ __ __ __ __ __ __作为temp。然后for(int i=0; i<noOfItems; i++){&nbsp; &nbsp; temp[i]=theItems[i];}将项目复制到temp. 所以我们会有:"Hello", "Hi", "Goodbye", "Bye" __ __ __ __(最后四个空格)然后theItems=temp;赋值theItems给temp. 这样,变量theItems将有四个空格,并且可以向其中添加更多项。请注意,Arrays该类已经内置了一个函数来执行此操作:Arrays.copyOf

慕莱坞森

最后要回答你的问题,你可以使用像注释演示的辅助方法,但在某处,必须创建一个单独的新数组并复制所有项目。数组是一种固定大小的构造——一旦你创建了一个,你就不能就地变大或变小。创建数组时,Java 堆的一部分(这是存储对象的内存区域的术语)等于一项的大小(在本例中为对字符串的引用)乘以数组的长度保留,并且对该内存的引用分配给您在语句左侧指定的变量,如String[] items = new String[10].因此,要items变大,您必须创建一个所需大小的新数组,按顺序复制所有现有项目,然后将保存较小数组的变量重新分配给较大数组的引用,此时保存在temp.&nbsp;items = temp;简单地将引用复制到itemssoitems并temp引用相同的数组。然后当方法结束时,items保留 whiletemp被删除。此外,由于现在有一个items没有变量引用的数组(之前提到的),Java 将在其垃圾收集周期中负责清理旧数组。但是,您不必担心数组中的项目会消失,因为您将它们的引用复制到新数组中。
随时随地看视频慕课网APP

相关分类

Java
我要回答