我有一个案例,我使用ArrayList来保存按列表中的位置键入的项目列表。其他对象按位置引用ArrayList项。如果我从列表中删除其中一个项目,我不希望列表缩小,因为这会使列表中项目的所有其他引用无效(例如,项目2现在位于位置1)。我对缩小数组列表问题的解决方案是使arraylist中的位置为空,以便列表不会缩小。我很好奇这是否会释放以前该项目所占据的记忆。
如果有更好的方法来完成这个要求,我想了解它。
答案 0 :(得分:7)
鉴于您的目标是长期按给定键(索引)长期引用项目您想要的实际上是Dictionary或Hashtable,ArrayList是用于您的目的的错误数据结构,并且以这种方式使用一个是确实非常危险。它只需要一个元素被某人和bingo bango删除所有引用都是错误的,比错误他们将获得不正确的数据更糟糕。
为此使用正确的数据结构,使用数据结构将元素与给定键相关联,这是一个字典或Hashtable。
答案 1 :(得分:2)
简短的回答是肯定的,如果没有其他对象的引用,内存将被释放。虽然你可以运行一个gc,但你不会真正控制它是如何以及何时被释放的,这不是一个好习惯,并不能保证它会被清除。
请注意,ArrayList未同步。您声明您有多个引用ArrayList的对象 - 您需要进行同步以避免并发修改。
你是否与ArrayList绑定?订单对您来说很重要,或者只是您对列表中的项目有一致的引用?
答案 2 :(得分:0)
如果java中的ArrayList
像.NET中的ArrayList
那样工作,它只是数组的包装器。如果内部数组太小,它将分配一个新的更大的数组并将所有项复制到新数组。每次内部阵列变得太小时,该过程将重复。
结论:
array[mypos] = null
时,将释放所包含的对象(除非其他人正在引用它)。