2

我有一个案例,我使用 ArrayList 来保留一个项目列表,这些项目由它们在列表中的位置键入。其他对象通过它们的位置引用 ArrayList 项。如果我从列表中删除其中一项,我不希望列表缩小,因为这会使对列表中项目的所有其他引用无效(例如,项目 2 现在位于位置 1)。我对缩小数组列表问题的解决方案是将数组列表中的位置设为空,这样列表就不会缩小。我很好奇这是否会释放该项目以前在该位置持有的内存。

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

4

3 回答 3

7

鉴于您的目标是在很长一段时间内通过给定键(索引)始终如一地引用项目,您想要的实际上是 Dictionary 或 Hashtable,因此 ArrayList 对于您的目的来说是错误的数据结构,并且以这种方式使用一个确实非常危险. 只需要一个元素被某人在某处删除,然后宾果游戏所有引用都是错误的,比错误更糟糕,他们将获得不正确的数据。

为此使用正确的数据结构,使用将元素与给定键相关联的数据结构,即字典或哈希表。

于 2012-11-27T03:19:42.923 回答
2

简短的回答是肯定的,如果没有其他对该对象的引用,内存将被释放。尽管您可以运行 gc,但您将无法真正控制释放它的方式和时间,但这不是一个好习惯,也不能保证它会被清理。

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

你绑定到 ArrayList 吗?顺序对您很重要,还是只是您对列表中的项目有一致的参考?

于 2012-11-27T03:04:24.013 回答
0

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

结论:

  1. 当您设置array[mypos] = null.
  2. 如果您继续添加新项目,内部数组将继续增长。
于 2012-11-27T07:28:57.680 回答