Java 用于存储大量字符串的数据结构是什么

Java 用于存储大量字符串的数据结构是什么,java,data-structures,Java,Data Structures,好吧,为了解释这个问题 我有: 一个大型数据库表,其中包含数百万个条目(每个条目可能有“n”个列) 概念: 我想向web界面显示两个列表(例如“可用”和“选定”)。 当用户将条目从一个列表移动到另一个列表时,我需要将条目的唯一id(字符串类型)临时存储到我的服务器中名为“selected”的“Unknown data structure”(未知数据结构),当用户最后单击submit(提交)时,我会将此列表进一步传递给其他应用程序 在数据库中进行排序和过滤,然后将全部数据(以块为单位)加载回jav

好吧,为了解释这个问题

我有:
一个大型数据库表,其中包含数百万个条目(每个条目可能有“n”个列)

概念:

我想向web界面显示两个列表(例如“可用”和“选定”)。 当用户将条目从一个列表移动到另一个列表时,我需要将条目的唯一id(字符串类型)临时存储到我的服务器中名为“selected”的“Unknown data structure”(未知数据结构),当用户最后单击submit(提交)时,我会将此列表进一步传递给其他应用程序

在数据库中进行排序和过滤,然后将全部数据(以块为单位)加载回java,然后检查每个条目是否选中,并将其添加到将在web界面中显示的列表中

for each entry{
  if(selected.contains(currentEntry.ID)){
    selectedList.add(currentEntry)
  }else{
    availableList.add(currentEntry)
  }
}
列表selectedList和availableList只包含几百个条目(显示给用户的条目,大约一页最多包含100-200个条目),因此“条目”类型的列表足够好,可以保存我的排序

问题:
“选定”结构必须包含数千个ID(有时可能达到百万个)

需要:
我需要快速访问来查找id是否存在(structure.contains(id)),因此我肯定会使用哈希结构。 我需要使用最小内存资源的结构

不需要:

不需要良好的删除性能。不需要排序。

My可能是您可以快速访问的东西,如HashSet。

您可以使用
树集,javadoc说它“为基本操作(添加、删除和包含)提供有保证的日志(n)时间成本”,如果您需要将某些内容链接到您的id,使用
HashMap

1。由于您需要持有数千个ID,因此
HashMap
是一个ans。如果已知密钥且插入速度很快,它的访问速度非常快

2.通常,
treemap
hashmap
都不同步,但是
hashtable
是同步的。同时,
hashtable
不允许空键或值。另一方面,
hashMap
允许一个空键

3.您也可以选择
TreeMap
,因为
TreeMap
允许我们按照用户定义的排序顺序检索元素。嗯,我认为
TreeMap
HashMap

编辑: 在读了几篇文章之后,我也看到了这篇

说真的,你最好远离哈希表 总共对于单线程应用程序,您不需要额外的资源 同步化的开销。对于高度并发的应用程序,偏执狂 同步可能导致饥饿、死锁或不必要的错误 垃圾收集暂停。正如蒂姆·霍兰德指出的,你可以使用 而不是ConcurrentHashMap


因此,我将使用
ConcurrentHashMap
HashSet
应该提供快速访问,并且最有可能是恒定时间访问,尽管我认为如果可行,您可以运行示例测试来检查是否由于数百万条条目和数据集的性质而存在太高的冲突


这当然不能满足您的最佳内存需求,您希望在Java内存中保存数百万个条目的大小是多少?如果它的占用空间很大(比如说1000的MB),你可能需要考虑分布式缓存,甚至考虑索引方法。

< P>在大量测试之后,我发现所有的哈希结构(HasSeT,LinkedHashMap等)都执行大致相同的操作。p> 当我超过200000个元素时,我开始面临测试系统溢出的问题(当然,这与硬件等有关)

我可能会使用DB表来保存所选ID,并使用联接直接从DB获取数据(无论哪种方式,我都会使用DB进行排序和筛选)


感谢@DariusX。对于“获胜”的建议和其他人的帮助。

我认为Set将是最好的。如果它必须容纳这么多条目,您可能应该将其转储到数据库表中,并使用一个额外的id(例如,某种类型的会话id)。经过大量测试,我意识到所有哈希结构(哈希集、LinkedHashMap等)的性能大致相同。TreeSet是我测试的性能最差的结构,需要花费最多的时间来查找和分析元素。当我超过200000个元素时,我开始面临测试系统溢出的问题(当然,这与硬件等有关)。我可能会使用DB表来保存所选ID,并使用联接直接从DB获取数据(无论采用哪种方式,我都会使用DB进行排序和筛选),谢谢您的帮助。