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!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...
随机推荐
- MySQL日常维护指南
一.常用命令 1.查看数据库默认编码 show variables like 'character%'; show variables like 'collation%'; 2.启动停止数据库 /et ...
- Pytorch 60实例
1 初识PyTorch¶ 1.1 张量 1.导入pytorch包 In [1]: import torch 2.创建一个未初始化的5x3张量 In [3]: x = torch.empty(5, 3) ...
- hbase master 无法启动
环境部署: hbase 采用azure的虚机,存储采用azure的blockblob. 问题: 生产碰到过几次,hbase master无法启动的问题,这种情况下是可以正常读写,但是如果这个时候,发生 ...
- [小技巧]Win32 - VS中手动编辑RC文件
用win32进行窗口编程时,如果资源文件不妥善集中管理会一不小心会删除一些资源文件,这时再进行项目编译的时候会发现rc文件因为缺失某个资源文件导致无法打开,我们常用的rc图形编辑器等于废了. 这时就需 ...
- Oracle数据库安装时,安装报错ins_emagent.mk
安装oracle数据库过程中,通过图形界面安装,出现ins_emagent.mk报错提示 解决方法 修改$ORACLE_HOME/sysman/lib/ins_emagent.mk,将$(MK_EMA ...
- AD域服务相关知识
一.活动目录及意义 活动目录:windows网络中的目录服务(Directory Service),即活动目录域服务(AD DS) 目录服务:目录和与目录相关服务 活动目录负责目录数据库的保存.新建. ...
- selenium 设置时区
driver = webdriver.Chrome() tz_params = {'timezoneId': 'America/New_York'} driver.execute_cdp_cmd('E ...
- lc.977 有序数组的平方
题目描述 给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序 排序. 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] ...
- php运行找不到命令
这个跟环境path设置有关: 1. 找php.ini位置./www/wdlinux/apache_php-5.5.38/bin 2. 写入默认path: export PATH=$PATH:/www/ ...
- Navicat Premium 16 永久破解激活
Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL.SQLite.Oracle 及 PostgreSQL 资料库,让管理不 ...