这是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?的更多相关文章

  1. Java:Set接口小记

    Java:Set接口小记 对 Java 中的 Set接口 与 其实现类,做一个微不足道的小小小小记 概述 public interface Set<E> extends Collectio ...

  2. Java中常见数据结构Set之HashSet

    今天来说说Java集合中的Set系列之HashSet.   Set我们众所周知的就是虑重功能, 我们平时在项目开发中也常用到这个特性的.那么Set为何能够虑重呢? 接下来我们就看下源码吧.   Set ...

  3. 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 ...

  4. Java编程的逻辑 (41) - 剖析HashSet

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  5. java基础33 Set集合下的HashSet集合和TreeSet集合

    单例集合体系: ---------| collection  单例集合的根接口--------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合 ...

  6. Java学习(set接口、HashSet集合)

    一.set接口 概念:set接口继承自Collection接口,与List接口不同的是,set接口所储存的元素是不重复的. 二.HashSet集合 概念:是set接口的实现类,由哈希表支持(实际上是一 ...

  7. Java:集合,Map接口框架图

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  8. Java:集合,Collection接口框架图

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  9. Java:类集框架中集合的学习

    Java:类集框架中集合的学习 集合 Java:Set的学习 Set是类集框架中的集合类.集合是不按特定的方式排序,并且没有重复对象的一种类. Q:Set如何操作?Set中的不按特定方式排序是怎么排序 ...

  10. java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)

    说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...

随机推荐

  1. .NET 5 WPF 配置文件变动 程序自动刷新 (reloadOnChange)

    using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extens ...

  2. DHCP分配IP的流程

    1.DHCP客户端以广播的形式发送DHCP Discover报文 2.所有的DHCP服务端都可以接收到这个DHCP Discover报文,所有的DHCP服务端都会给出响应,向DCHP客户端发送一个DH ...

  3. SQL的分类

    DDL: 数据定义语言,用来定义数据库对象(数据表,表 ,字段) : DML:数据操作语言,用来对数据库表中的数据进行增删改 : DQL:数据库查询语言,用来查询数据库中的表的记录 DCL:数据控制语 ...

  4. restfull风格传参

  5. CH573 CH582 CH579蓝牙从机(peripheral)例程讲解二(广播内容修改)

    在上一篇外设例程讲解中讲述了蓝牙从机的收发接口,这样可以快速的上手,那么接下来就讲解另一个重要设置,从机的广播. 在peripheral例程中,一直是以50ms的周期进行广播,使用手机软件扫描可以获取 ...

  6. Redis学习(黑马篇)

    1.redis是一个键值型数据库即在Redis内存的数据都是键值对的格式,如: 2.NOSQL非关系型数据库与MySQL关系型数据库对比: 非结构化类型分为:键值类型(Redis)(value支持多种 ...

  7. python之tk学习,闲鱼搜索-小记

    (如想转载,请联系博主或贴上本博地址) 编程,逻辑,总是让人如痴如醉. 下面进入正题. 火热的天气配上火热的python,python的入门友好性让门外汉们都看到了希望.当然自己写的程序如果没有GUI ...

  8. nginx 代理路径

    反向代理被代理url没有截取 /report/api/ /report/api/bussinessRisk/zhucai/creditInquiry 应该是/bussinessRisk/zhucai/ ...

  9. ubuntu14.04 cm12.0 genymotion

    前几天在ubuntu14.04编译过android5.0.1源码,但是呢?不知怎么运行不起来,后来又试了试把img文件在win平台运行虚拟机不知怎么还是不行,再后来想通过刷机运行学习framework ...

  10. Python库之os库和logging库的基本使用说明

    使用os库操作目录及文件 使用os.sep() 方法获取系统分隔符 print(os.sep) 使用os.name()方法获取操作系统的平台类型 print(os.name) 使用os.getcwd( ...