使用ArrayList或HashMap

时间:2010-01-05 11:17:58

标签: arraylist hashmap

您好我有关于是否使用ArrayListHashMap

的问题

我正在尝试构建一个Paint程序。 将为每个绘制的对象分配一个唯一的对象ID

如果我想在点击某个对象时获得快速检索速度,我应该使用arraylist还是hashmap

一般情况下,hashmap有O(1),而arraylist有O(n)检索速度。

但是,我认为对于我的情况,因为当我点击一个对象时,我将获得ID,因此数组的索引和我可以做类似ArraylistObject.get(ithElement); ,那么在这种情况下,这也将是一个O(1)检索过程?

任何输入?

谢谢!

3 个答案:

答案 0 :(得分:6)

如果对象具有可以一对一映射到数组的ID,那么也将是O(1)访问,并且实际上将比hashmap查找稍快(您不必计算哈希值。

但是,问题是删除对象时会发生什么。您将在列表中留下一个洞。在创建新对象时,您可以继续追加到列表中并让它慢慢变得更加碎片化,或者尝试找到一个备用插槽,在这种情况下,您将进行O(n)搜索备用空间。

简而言之 - 散列图可能更合适。

答案 1 :(得分:1)

从好的方面来说,你可以通过恰到好处的ArrayLists来挤出一些额外的性能。 但删除对象将是一个皇家的痛苦 - 正如Paolo和Anurag所说,你要么必须放置一个空的占位符(null?),要么重新编号其他一些其他对象以填补空白。 这可能会导致性能错误和普通的旧错误。

另一方面,

HashMaps。使用简单,保证了良好的性能(除非您非常严重地分配您的ID)。

按ID检索对象可能根本不会成为应用程序的瓶颈。俗话说,过早优化是万恶之源

答案 2 :(得分:1)

如果你可以保证ID将在一个相对较小的数值范围内,那么你应该使用一个普通数组(大小预先初始化为最大ID),而不是{{1 }}。这可以确保您不会意外删除条目并转移其他所有内容以填补空白,一切都以错误的索引结束。普通数组也比ArrayList快一点。

如果您无法做出此类保证,请使用HashMap。速度差异不太可能明显,并且更容易维护。