Java:Should I use a `HashSet` or a `TreeSet` for a very large dataset?
这是StackOverflow上一个有意思的提问,记录一下。
原地址在这
翻译:
对于大型数据集,应该使用”哈希集”还是”树集”?
(因为HashTable有着O(1)的查找速度比树结构更有效率,虽然HashTable的数据无序,但这不是本文的重点)
我需要在数据结构中存储2到1500万个帐户(长度为15的String),以进行查找和检查唯一性。
最初我计划将它们存储在HashSet中,但我怀疑由于哈希冲突而导致查找速度会变慢,并且最终会比TreeMap(使用二叉搜索)慢。
不要求对数据进行排序。我正在使用Java7。我有专用于该应用程序的64G系统和48G。
此问题不是HashSet和TreeSet性能测试的重复项,因为该问题与向Set中添加元素的性能有关,而此问题与为重复的值检查现有Set的性能有关。
如果您有48 GB的专用内存用于200万至1500万条记录,则最好的选择是使用HashMap<Key, Record>,根据您的要求,密钥为Integer或String。
只要向Map提供足够的内存并具有适当的负载系数,就可以满足哈希冲突的所有要求。
我建议使用以下构造函数:new HashMap<>(13_000_000);(比您预期的记录数多30%-HashMap的实现会自动将其扩展到2^24单元)。
告诉您的应用程序,这个Map从一开始就很大,因此不需要在填充时自动增长。
HashMap使用O(1)作为其成员的访问时间,而TreeMap使用O(log n)的查找时间,但可以更有效地利用内存,并且不需要聪明的哈希函数。但是,如果您使用String或Integer键,则不必担心设计哈希函数,并且恒定时间查找将是一个巨大的改进。另外,TreeMap / TreeSet的另一个优点是排序的顺序,您说过您并不在意;使用HashMap。
如果列表的唯一目的是检查唯一的帐号,那么我上面所说的所有内容仍然适用,但是正如您在问题中所述,应使用HashSet<String>,而不是HashMap 。性能建议和构造函数参数仍然适用。
Java:Should I use a `HashSet` or a `TreeSet` for a very large dataset?的更多相关文章
- Java:Set接口小记
Java:Set接口小记 对 Java 中的 Set接口 与 其实现类,做一个微不足道的小小小小记 概述 public interface Set<E> extends Collectio ...
- Java中常见数据结构Set之HashSet
今天来说说Java集合中的Set系列之HashSet. Set我们众所周知的就是虑重功能, 我们平时在项目开发中也常用到这个特性的.那么Set为何能够虑重呢? 接下来我们就看下源码吧. Set ...
- LeetCode第[1]题(Java):Two Sum 标签:Array
题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- Java编程的逻辑 (41) - 剖析HashSet
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- java基础33 Set集合下的HashSet集合和TreeSet集合
单例集合体系: ---------| collection 单例集合的根接口--------------| List 如果实现了list接口的集合类,具备的特点:有序,可重复 注:集合 ...
- Java学习(set接口、HashSet集合)
一.set接口 概念:set接口继承自Collection接口,与List接口不同的是,set接口所储存的元素是不重复的. 二.HashSet集合 概念:是set接口的实现类,由哈希表支持(实际上是一 ...
- Java:集合,Map接口框架图
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- Java:集合,Collection接口框架图
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- Java:类集框架中集合的学习
Java:类集框架中集合的学习 集合 Java:Set的学习 Set是类集框架中的集合类.集合是不按特定的方式排序,并且没有重复对象的一种类. Q:Set如何操作?Set中的不按特定方式排序是怎么排序 ...
- java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)
说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...
随机推荐
- Assert的使用和简单解释
Assert 的简单使用 Document d = Jsoup.connect("http://www.baidu.com").get(); Assert.notNull(d, & ...
- create_generated_clock 的用法
本文转载自:create_generated_clock_亓磊的博客-CSDN博客_create_generated_clock 文章目录 参数source和master_clock区别 create ...
- 在Windows平台上利用CMD命令行来压缩和解压缩.tar.gz压缩包
解压命令: tar -xzvf dwt.tar.gz -C tmp/ 上述命令将dwt.tar.gz压缩包解压到tmp/文件夹 压缩命令: tar -czvf dwt.tar.gz dwt/ 上述命令 ...
- Codeforces Round #809 (Div. 2) A-E
Codeforces Round #809 (Div. 2) 2022/7/19 下午VP 传送门:https://codeforces.com/contest/1706 A. Another Str ...
- 记录Nginx配置
1 # Proxy to the Airsonic server location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_hea ...
- Ansible之Playbook介绍和使用
1.https://blog.csdn.net/zfw_666666/article/details/124691877 1.Playbook介绍 Playbook与ad-hoc相比,是 ...
- 老系统的奇葩问题-tomcat7启动失败
好多年的tomcat7系统了 当时部署安装为了服务 直接启动 就这么简单 好多年没动过了 这次修改了些东西 需要重启 却报错了... 解决: 把服务删除 使用bat启动 成功. 原因:可能是多个 ...
- Python中列表、元组、字典的区别
列表: 列表是一种数据结构,每一个元素对应一个值.例如:list=['a','b','c'] 访问列表数据通过下标的方式来进行数据访问,list[下标] list.append(i) 添加数据 de ...
- 对于Java课上问题的探究和解答
问题一:子类和父类的继承关系(extends) 需要强调的是,子类自动声明继承父类中的public和protected的成员 其中,public成员,外界可以自由访问: private成员,外界无法进 ...
- 开源规则引擎——ice:致力于解决灵活繁复的硬编码问题
背景介绍 业务中是否写了大量的 if-else?是否受够了这些 if-else 还要经常变动? 业务中是否做了大量抽象,发现新的业务场景还是用不上? 是否各种调研规则引擎,发现不是太重就是接入或维护太 ...