Java性能:地图与列表
我在JSF1.2和Richfaces 3.3.2中构建了一个树分页,因为我有很多树节点(类似于80k),并且它很慢..
因此,作为第一次尝试,我使用页面和页面的节点列表创建一个HashMap。
但是,性能不够好……
所以我想知道是否比HashMap更快,可能是列表或其他东西。
有人有这方面的经验吗? 我能做什么?
提前致谢。
编辑。
最大的问题是我必须在树的子节点中validation用户的权限。 我知道这是一个大问题:这个validation很慢,因为我必须进入节点,我没有一个好方法来知道用户是否在10级节点中拥有权限而没有迭代所有节点。 除此之外,同样的三个在更多的地方使用了……我为什么要做这个分页的基本原因是客户端会慢很多,因为richfaces生成的结构,很多tr和td的,浏览器就这么疯狂了。 所以,不幸的是,我必须加载所有节点,并且只是客户端分页,我需要知道它们中的哪些更快迭代…
对不起我的英文不好。
如果要获取页面的所有节点,则哈希映射是最快的数据结构。 节点列表可以在恒定时间(O(1))中获取,而列表时间是O(n)(n =页面数,在排序列表上更快但从未接近O(1))
您的数据结构上的哪些操作太慢 。 这是您在开始优化之前必须分析的内容。
这可能更多是由于JSF是性能猪而不是数据结构选择。 我已经看到创建一个JSF应用程序的一次尝试可以定时与日..
你在没有更多关于根本原因的知识的情况下猜测解决方案是错误的。 我建议您分析您的应用以查看花费的时间。
要使用的数据结构始终取决于您需要如何存储数据以及如何访问它。 如果是密钥HashMap
应该在访问值时具有恒定的时间复杂度。 当你调用get(key)
,会计算key
的hashCode()
,并用它来检索相关的值。 除非你有不同的密钥具有相同的哈希码(在这种情况下你可能做错了,因为虽然不是强制性的,但不同的对象应该有不同的哈希码,至少在大多数情况下),这通常很快。
搜索普通列表中的元素需要扫描列表,这几乎总是比计算哈希码慢。
如果需要将值与键相关联,则可以使用Map
。 而HashMap
应该足够快。
我不太了解JSF,但我认为 – 如果数据结构和访问模式是Map
的设计 – 问题不在于HashMap
本身。
我会用一个获取子节点的javascript / ajax调用方法来解决这个问题。