2009-07-28 30 views
2

我的TableModel实现通常坐在ArrayList允许有效的随机访问性能。然而,ArrayListremove(int)实现看起来是非常低效的,因为它涉及制作System.arrayCopy(...)呼叫由1高效的表模型实现

人采取执行TableModel叫什么办法给所有后续元素移回?我应该考虑一个更好的数据结构吗? ...也许是第三方图书馆?

更多信息:我的表数据可以缩小和增长,因此任何固定大小的缓冲区实现都不起作用。

在此先感谢。

回答

2

您的问题反映了“过早优化”。

在我的电脑上,System.arrayCopy()可以拷贝1 million elements of data in roughly 13ms。所以我建议衡量这是否真的是一个问题。在一般情况下,ArrayList比任何其他类似的数据结构更快并且具有更好的内存性能。

使用LinkedList会使这份名单上的所有操作(包括remove())更慢,因为你现在将不得不遍历一半的列表元素的每个操作(平均)。所以大多数操作将从O(1)到O(N/2)。

+0

谢谢Aaron,这是一个很好的观点。 TBH我打算在构建定制任何东西之前尝试ArrayList - 我只是想知道是否有更高效的开箱即用。 – Adamski 2009-07-28 08:33:24

0

如果您需要经常移除元素,您可以选择一个LinkedList实现。您为快速移除付出一点回忆。

+0

不幸的是,这会显着影响我的访问时间,因为LinkedList不是随机访问,所以这不是一个真正的选择(特别是我的表可能包含大约10000行)。 – Adamski 2009-07-28 08:34:11

1

在实现TableModel的,你需要考虑两件事情

1)创建和操作模型

2)使你的表

首先是很多不太重要的性能明智的,然后第二个。

典型情况下,您只需创建一次模型并执行少量操作,表格背后的呈现引擎将持续查询您的表模型。这意味着从模型中检索信息必须是最优的,因此应该避免采用任何为了以模型查询为代价来加速模型操作的行为。

在我的情况下,我需要这两个,重操纵和快速渲染。所以我做的选择是一种LinkedList实现,用于与数组结合的所有操作,两者都保持同步,所有插入,删除操作都是通过链表结构完成的,所有的呈现都使用数组结构