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

Java:删除/打包方法,有人可以解释一下吗?

Java:删除/打包方法,有人可以解释一下吗?

神不在的星期二 2021-09-29 17:10:57
有人可以向我解释这种方法是如何工作的吗?我不明白他们如何在数组中移动以删除项目索引。private void pack(int index) {.    for(int i =index; i<noOfItems-1; i++)        theItems[i]=theItems[i+1];    noOfItems--;}
查看完整描述

3 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

从索引开始,每个值都移动一个到数组的开头。


theItem[index] = theItem[index+1];

theItem[index+1] = theItem[index+2];

由于 index 处的值永远不会写入新位置,因此无法再访问它。


最后noOfItems减一,因为现在数组中的元素少了一个。


在调用 pack(4)的数组[1,2,3,4,5,6]上noOfItems = 6会发生以下情况:


[1,2,3,5,5,6]

[1,2,3,5,6,6]


noOfItems = 5

6数组中的最后一个没有消失,但是由于每隔一段代码(我猜)都noOfItems在用来计算数组的末尾,因此不再看到它。


查看完整回答
反对 回复 2021-09-29
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

他们正在将数组的下一个值写入其中并减小数组大小。

例如,

int a[] = new int[] {1,2,3,4,5}

如果我打电话,pack(2)那么打印 a 的输出是

{1,2,4,5,5}


查看完整回答
反对 回复 2021-09-29
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

我不明白他们如何在数组中移动以删除项目索引。


他们没有。Java 数组的大小是固定的,因此代码只是简单地复制从一个元素开始index到noOfItems左边的所有项,然后记录数组所包含的项数减一这一事实。


这是一个例子:假设你从这个十元素数组开始


0 1 2 3 4 5 6 7 8 9

A B C D E F G H _ _

              ^

              |

             last item

现在您希望删除索引 4 处的项目。该算法将按如下方式转换数组:


0 1 2 3 4 5 6 7 8 9

A B C D F G H H _ _

            ^

            |

            last item

请注意,索引 7 处的项目被复制,但没有被删除。它的内容并不重要,因为它已经超过了最后一项的位置(即noOfItems)。


在某些情况下,这会出现问题 - 特别是,当数组的“死”部分中有大对象时,它们可能会“徘徊”超过它们应该有资格进行垃圾收集的时间。


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

添加回答

举报

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