Java性能:地图与列表

时间:2012-03-14 12:35:19

标签: java performance

我在JSF1.2和Richfaces 3.3.2中构建了一个树分页,因为我有很多树节点(类似于80k),而且速度很慢..

因此,作为第一次尝试,我使用页面和页面的节点列表创建一个HashMap。

但是,表现不够好......

所以我想知道是否比HashMap更快,可能是列表或其他东西。

有人对此有一些经验吗?我该怎么办?

提前致谢。


EDIT。

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

抱歉我的英文不好。

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

这可能更多是由于JSF是性能猪而不是数据结构选择。我已经看到创建一个JSF应用程序的一次尝试可以用日..时间。

在没有更多关于根本原因的知识的情况下猜测解决方案,你犯了一个错误。我建议您对自己的应用进行分析,以了解花费的时间。

答案 2 :(得分:2)

要使用的数据结构始终取决于您需要如何存储数据以及如何访问它。假设密钥,HashMap<K, V>应该在访问值时具有恒定的时间复杂度。当您致电get(key)时,会计算hashCode() key,并用它来检索相关值。除非你有不同的密钥具有相同的哈希码(在这种情况下你可能做错了,因为虽然不是强制性的,但不同的对象应该有不同的哈希码,至少在大多数情况下),这通常很快

搜索普通列表中的元素需要扫描列表,这几乎总是比计算哈希码慢。

如果您需要将值与键相关联,则可以使用Map。并且HashMap应该足够快。

我对JSF知之甚少,但我认为 - 如果数据结构和访问模式是Map设计的那个 - 问题不在于HashMap本身。

答案 3 :(得分:-1)

我会用一个获取子节点的javascript / ajax调用方法来解决这个问题。