我要求一个Map最多可以构建50~200个条目(可能更多,不管怎么说,我们称之为太少了)。写作只进行一次,阅读(使用Map.get(“keyName”))每个请求可以超过20个(这是一个webapp)。
我正在寻找Hashmap,因为它(我想)给了我最佳的性能(注意:每个请求有很多次读取)。不是数据结构的人,你们中的任何人都可以建议一个最符合我要求的Map实现,例如java.lang。*,Apache commons等包吗?
YC
答案 0 :(得分:7)
除非您确实遇到了性能问题(并且已将其跟踪到此代码),否则我不会担心。
在我尝试更换地图之前,我先看看为什么,确切地说,我需要进行4000次查找(每次20次读取200次)以生成网页。
但在赌注时我猜测,与过程的其他部分相比,进行4000次查找的时间可以忽略不计。
答案 1 :(得分:2)
如果所有写入都在任何读取之前完成,那么您可以使用Collectons.unmodifiableMap方法。
如果情况并非如此,那么编写代码来做你想做的事情并不是非常困难(徘徊去寻找有基本代码的帖子......)
嗯......只是为了确定问题是我在想什么...是唯一的重要部分还是试图快速访问数据最重要的部分?
编辑:(根据评论)
您是否检查过,如果代码很慢,请使用分析器?如果没有,那么你不应该担心它。
答案 2 :(得分:1)
如果这实际上是一个瓶颈,我会考虑调整地图大小以避免碰撞。
答案 3 :(得分:1)
如果确实值得这么麻烦,你可以试试perfect hashing。不过,我不熟悉任何Java实现。
答案 4 :(得分:0)
如果你在读者开始之前严格写作,那么跨线程的同步和共享不是问题...... HashMap是你的朋友。当您不确定时:ConcurrentHashMap。
这两个实现都是JDK的一部分。
答案 5 :(得分:0)
几年前(作为一个学校项目),我在C中实现了一次写入多次读取(和其他集合),它采用了现有的集合,然后通过创建更多的内存和缓存来“密封它” - 有效表示(例如,图形被存储为优化阵列)。我们看到了惊人的性能差异。
由于Java支持接口,实现这样的东西可以更容易(事实上鼓励),但我不熟悉开箱即用的实现。