首页 > 编程语言 >Java的HashSet和HashMap性能选项

Java的HashSet和HashMap性能选项

时间:2022-11-05 20:45:27浏览次数:48  
标签:负载 hash HashMap HashSet 极限 Hashtable Java

Java的HashSet和HashMap性能选项

1.* HashSet和HashMap的性能选项

对于HashSet及其子类而言,它们采用hash算法来决定集合中元素的存储位置,并通过hash算法来控制集合的大小;对于HashMap、Hashtable及其子类而言,它们采用hash算法来决定Map中key的存储,并通过hash算法来增加key集合的大小。

hash表里可以存储元素的位置被称为“桶(bucket)”,在通常情况下,单个“桶”里存储一个元素,此时有最好的性能:hash算法可以根据hashCode值计算出“桶”的存储位置,接着从“桶”中取出元素。但hash表的状态为open:在发生“hash冲突”的情况下,单个桶会存储多个元素,这些元素以链表形式存储,必须按顺序搜索。如图所示是hash表保存各元素,且发生“hash冲突”的示意图:

image

因为HashSet和HashMap、Hashtable都使用hash算法来决定其元素(HashMap则只考虑key)的存储,因此HashSet、HashMap的hash表包含如下属性:

  • 容量(capacity):hash表中桶的数量。
  • 初始化容量(initial capacity):创建hash表时桶的数量。HashMap和HashSet都允许在构造器中指定初始化容量。
  • 尺寸(size):当前hash表中记录的数量。
  • 负载因子(load factor):负载因子等于size/capacity。负载因子为0,表示空的hash表,0.5表示半满的散列表,依此类推。轻负载的散列表具有冲突少、适宜插入与查询的特点(但是使用Iterator迭代元素时比较慢)。

除此之外,hash表里还有一个“负载极限”,“负载极限”是一个0~1的数值,“负载极限”决定了hash表的最大填满程度。当hash表中的负载因子达到指定的“负载极限”时,hash表会自动成倍地增加容量(桶的数量),并将原有的对象重新分配,放入新的桶内,这称为rehashing。

HashSet和HashMap、Hashtable的构造器允许指定一个负载极限,HashSet和HashMap、Hashtable默认的“负载极限”为0.75,这表明当该hash表的3/4已经被填满时,hash表会发生rehashing。

“负载极限”的默认值(0.75)是时间和空间成本上的一种折中:较高的“负载极限”可以降低hash表所占用的内存空间,但会增加查询数据的时间开销,而查询是最频繁的操作(HashMap的get()与put()方法都要用到查询);较低的“负载极限”会提高查询数据的性能,但会增加hash表所占用的内存开销。程序员可以根据实际情况来调整HashSet和HashMap的“负载极限”值。

如果开始就知道HashSet和HashMap、Hashtable会保存很多记录,则可以在创建时就使用较大的初始化容量,如果初始化容量始终大于HashSet和HashMap、Hashtable所包含的最大记录数除以负载极限,就不会发生rehashing。使用足够大的初始化容量创建HashSet和HashMap、Hashtable时,可以更高效地增加记录,但将初始化容量设置太高可能会浪费空间,因此通常不要将初始化容量设置得太高。

标签:负载,hash,HashMap,HashSet,极限,Hashtable,Java
From: https://www.cnblogs.com/hzhiping/p/16861026.html

相关文章

  • SpringBoot实战笔记:02_使用注解与Java配置的Aop示例
    转载:https://blog.csdn.net/android_zyf/article/details/79579875<!--02_新的依赖--><!--导入spring的aop支持--><dependency><groupId>${spring-groupId}</groupId>......
  • Java的Map集合
    Java的Map集合1.*MapMap用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value都可以是任何引用类......
  • java IO复制文件
    packagecom.tedu.day1201;importjava.io.FileInputStream;importjava.io.FileOutputStream;publicclassCopyFile{publicstaticvoidmain(String[]args)......
  • JAVA----线程生命周期和状态
    1.新建状态(New)新创建了一个线程对象,但还没有调用start()方法。实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了新建状态。2.Runnable状态......
  • SpringBoot实战笔记:01_Spring中的Java配置
    转载:https://blog.csdn.net/android_zyf/article/details/79579862Spring4.x与SpringBoot都推荐使用Java配置xml配置:将bean的信息配置在xml配置文件中注解配置:在对应的bea......
  • Java学习——11.06
    Java的第一个大关。scanf函数的不同。这可能就是收到C语言的思维影响吧,Java中的scanf函数的运用和先前引用实例变量一样,要先new一个。例:Scannerscanner=newScann......
  • java常用API--->ArryList集合基础
    简述集合和数组的对比数组长度固定,集合长度可变。数组可存储基本数据类型和引用数据类型,集合只能存储引用数据类型,如果要存储基本数据类型要将其变成包装类Arrylis......
  • JavaIO流
    我们得先了解什么是文件?文件就是我们保存数据的地方(类似word文档,excel文件,png图片,MP4视频,…这些都是存储数据的地方)流的概述​要完成文件的读写操作,就必须了解C#中另外......
  • JAVAI学习笔记
    文件流什么是文件流?数据从一个地方流到另一个地方可读流(Readable):外部设备(磁盘,网卡,显卡,打印机等等)--->>>内存可写流(Writeable):内存--->>>外部设备(磁......
  • 在网页中加载闪存文件系统中的图片、css和javascript
    在网页中加载闪存文件系统中的图片、CSS和JavaScript–太极创客(taichi-maker.com)index.html:ESP8266开发板建立的网站首页main.css:控制网页的css(层叠样式表)JavaS......