如何在不缩小列表的情况下从arraylist中删除项目

时间:2012-11-27 02:44:30

标签: java

我有一个案例,我使用ArrayList来保存按列表中的位置键入的项目列表。其他对象按位置引用ArrayList项。如果我从列表中删除其中一个项目,我不希望列表缩小,因为这会使列表中项目的所有其他引用无效(例如,项目2现在位于位置1)。我对缩小数组列表问题的解决方案是使arraylist中的位置为空,以便列表不会缩小。我很好奇这是否会释放以前该项目所占据的记忆。

如果有更好的方法来完成这个要求,我想了解它。

3 个答案:

答案 0 :(得分:7)

鉴于您的目标是长期按给定键(索引)长期引用项目您想要的实际上是Dictionary或Hashtable,ArrayList是用于您的目的的错误数据结构,并且以这种方式使用一个是确实非常危险。它只需要一个元素被某人和bingo bango删除所有引用都是错误的,比错误他们将获得不正确的数据更糟糕。

为此使用正确的数据结构,使用数据结构将元素与给定键相关联,这是一个字典或Hashtable。

答案 1 :(得分:2)

简短的回答是肯定的,如果没有其他对象的引用,内存将被释放。虽然你可以运行一个gc,但你不会真正控制它是如何以及何时被释放的,这不是一个好习惯,并不能保证它会被清除。

请注意,ArrayList未同步。您声明您有多个引用ArrayList的对象 - 您需要进行同步以避免并发修改。

你是否与ArrayList绑定?订单对您来说很重要,或者只是您对列表中的项目有一致的引用?

答案 2 :(得分:0)

如果java中的ArrayList像.NET中的ArrayList那样工作,它只是数组的包装器。如果内部数组太小,它将分配一个新的更大的数组并将所有项复制到新数组。每次内部阵列变得太小时,该过程将重复。

结论:

  1. 当您设置array[mypos] = null时,将释放所包含的对象(除非其他人正在引用它)。
  2. 如果您不断添加新项目,内部数组将继续增长。