好吧,解释一下问题......
我有:
一个大数据库表填充了数百万个条目(每个条目可能有“n”列的数量)。
概念:
我想向网络界面展示两个列表(例如“可用”和“已选择”)。 当用户将条目从一个列表移动到另一个列表时,我需要将条目的唯一ID(字符串类型)临时存储到我的服务器中名为“selected”的“未知数据结构”,并且当用户最终单击提交时我会将此列表进一步传递给其他应用程序。
对数据库进行排序和过滤,然后将全部数据(以块为单位)加载回java,然后检查每个条目是否被选中并将被添加到将要出现的列表中显示在网络界面中。
for each entry{
if(selected.contains(currentEntry.ID)){
selectedList.add(currentEntry)
}else{
availableList.add(currentEntry)
}
}
列表selectedList和availableList只能容纳几百个条目(显示给用户的条目,大约是一个最多100-200个条目的页面),因此类型“条目”的列表足够好并保持我的排序。
问题:
“选定”的结构必须容纳数千个ID(有时可能达到数百万个)。
需要:
我需要快速访问以查找id是否存在(structure.contains(id))所以我肯定会使用哈希结构。
我需要使用最少内存资源的结构。
不需要:
不需要良好的删除性能。不需要排序。
答案 0 :(得分:1)
mybe你可以像HashSet一样快速访问的东西。
答案 1 :(得分:1)
你可以使用TreeSet
,javadoc说“为基本操作提供保证的log(n)时间成本(添加,删除和包含)”,如果你需要链接根据您的身份,使用HashMap
答案 2 :(得分:1)
经过大量测试后,我意识到所有Hash结构(HashSet,LinkedHashMap等)的表现大致相同。
当我超过200,000个元素(当然这与硬件等有关)时,我开始面临我的测试系统溢出的问题。
我可能会转到使用数据库表来保存选定的ID并使用连接从数据库直接获取数据的解决方案(我会使用数据库进行排序和过滤)
感谢@DariusX。为了“获胜”的建议和其他所有人的帮助。
答案 3 :(得分:0)
1.由于你需要拥有数以千计的ID,所以HashMap
就是一个问题。如果密钥已知且快速插入,则访问速度非常快。
2.一般来说,treemap
和{ hashmap
未同步,但hashtable
已同步。同时,hashtable
不允许空键或值。另一只手hashMap
允许一个空键。
3.您也可以转到TreeMap
,因为TreeMap
允许我们按照用户定义的某个排序顺序检索元素。好吧,我认为TreeMap
比HashMap
修改强> 读完几篇文章之后我也遇到了这个......
说真的,你最好远离Hashtable 共。对于单线程应用程序,您不需要额外的 同步的开销。对于高度并发的应用程序,偏执狂 同步可能导致饥饿,死锁或不必要 垃圾收集暂停。就像Tim Howland指出的那样,你可以使用 而不是ConcurrentHashMap
所以,我会选择ConcurrentHashMap
答案 4 :(得分:0)
HashSet
应提供快速访问,并且最有可能是恒定时间访问,但我认为如果可行,您可以运行样本测试以检查是否由于数百万的进入和性质而导致过高的冲突你的数据集。
这肯定无法满足您的最佳内存要求,您希望将数百万条目保存到Java内存中的大小是多少?如果它的占用空间非常大(比如1000的MB),您可能需要考虑分布式缓存,甚至考虑索引方法。