我有一个困扰我一段时间的问题。我有一个软件,我在物理世界中生成一定数量的对象,将它们存储在ArrayList中。但是,从ArrayList中删除对象时,此实现会产生滞后。
静态数组实现不会导致滞后,但由于我无法使用“add”和“remove”,因此不太实用。
我假设ArrayLists的滞后是由于内存释放和重新分配。由于我的ArrayList具有固定的最大大小,是否可以预先分配一定的内存,以避免这些问题?或者还有其他解决方案吗?
非常感谢您提供任何帮助!
答案 0 :(得分:2)
我通常不会仅仅重新发布别人的答案,但this似乎非常合适。
答案 1 :(得分:2)
这里的问题是ArrayList
在内部实现,如名称所示,带有数组。这意味着无法在您使用索引之后移动元素,无法自由插入或移除集合的元素。
因此,如果您的集合中有很多元素,例如,删除第5个元素,那么从第6个到结尾的所有元素必须向左移动一个位置。这确实很昂贵,并导致 O(n)复杂性。
要避免这些问题,您应根据要在其上使用的最常见操作选择合适的集合。如果你需要迭代,删除(实际上删除需要找到元素,所以只要你已经枚举它们就好了)或者插入元素但是每当你想要访问特定索引时,LinkedList
都可能是好的正在陷入麻烦。
您还可以查找HashSet
或TreeSet
,它们可能适合您的解决方案。
在这些情况下,了解最常见的数据结构如何工作以及哪些是好的/坏的始终对于做出适当的选择非常有用。