2012-03-14 34 views
3

我已经建设JSF1.2和RichFaces的3.3.2树分页,因为我有很多树的节点(像80K),以及它的速度慢..Java性能:地图VS列表

所以作为第一次尝试,我创建了一个带有页面和页面节点列表的HashMap。

但是,性能不够好......

所以我在想,如果是东西比一个HashMap快,也许一个列表或东西的清单。

有人有这方面的经验?我能做什么?

在此先感谢。


编辑。

最大的问题是我必须验证树的子节点中用户的权限。我知道这是一个大问题:这个验证很慢,因为我必须进入节点,我没有一个很好的方法来知道用户在第10级节点中是否具有权限,而不必重复所有这些权限。此外,同样的三个在更多的地方使用... 为什么我这样做分页的基本原因是客户端将会很慢,因为richfaces生成的结构,很多tr和td的,浏览器就这么疯狂。 所以,不幸的是,我不得不加载所有的节点,并分页客户端,我需要知道它们是什么更快迭代...

对不起,我的英语不好。

+0

也许重复到http://stackoverflow.com/questions/1518103/hashmap-vs-arraylist-performance-am-i-correct – MJM 2012-03-14 12:38:15

+10

这不是你使用哪个集合的问题;将所有数据加载到一个集合中是错误的,但分页程序背后的整个想法是仅加载当时需要的相关数据子集。 – Viruzzo 2012-03-14 12:38:44

+0

这取决于你如何使用这些集合,什么是缓慢的。你能提供一些关于你如何实现分页的更多细节。另外,你是否分析你的代码?如果是的话,什么是缓慢的部分,访问/填充结构,加载页面上的数据或表达式? – Thomas 2012-03-14 12:40:31

回答

7

如果您希望获取页面的所有节点,则哈希映射是最快的数据结构。节点列表可以在恒定时间(O(1))中获取,而列表中时间为O(n)(n =页数,在排序列表上更快,但不会接近O(1))

什么您的数据结构上的操作是太慢。这就是你开始优化之前必须分析的内容。

2

这可能更多的是由于JSF是一个性能比数据结构选择的事实。我见过创建JSF应用程序的一次尝试可以用日time计时。

通过猜测解决方案而不了解根本原因,您犯了一个错误。我建议你分析你的应用,看看时间花在哪里。

+0

+1:如果你没有测量你的应用程序的性能,你只是猜测。我敢打赌,你会发现HashMap甚至不会显示在你的个人资料结果中。 ;) – 2012-03-14 12:47:57

0

我会用一个javascript/ajax调用方法解决这个问题,该方法可以读取子节点。

2

要使用的数据结构始终取决于您需要如何存储数据以及如何访问数据。 HashMap<K, V>应该在访问该值时具有恒定的时间复杂度,提供密钥。当您致电get(key)时,将计算的key,并将其用于检索相关值。除非你有不同的键具有相同的散列码(在这种情况下,你可能做错了什么,因为while不是强制性的,至少在大多数情况下,不同的对象应该有不同的散列码),这通常是快速的。

在普通列表中搜索一个元素需要扫描该列表,这将(几乎)总是比计算散列码慢。

如果您需要将值与键关联,则Map即可。而且HashMap应该足够快。

我不太了解JSF,但我认为 - 如果数据结构和访问模式是Map的设计目的 - 问题不是HashMap本身。