为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

人到中年有点甜 2021-09-29 13:37:59
我不确定这种方法是如何工作的。我的理解是我们创建了一个临时数组,其大小是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;}
查看完整描述

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仍会引用新数组。


查看完整回答
反对 回复 2021-09-29
?
手掌心

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


查看完整回答
反对 回复 2021-09-29
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

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

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

因此,要items变大,您必须创建一个所需大小的新数组,按顺序复制所有现有项目,然后将保存较小数组的变量重新分配给较大数组的引用,此时保存在tempitems = temp;简单地将引用复制到itemssoitemstemp引用相同的数组。然后当方法结束时,items保留 whiletemp被删除。

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


查看完整回答
反对 回复 2021-09-29
  • 3 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信