7.7 HashSet和HashMap的性能选项

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

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

下图是hash表保存个元素,且发生"hash冲突"的示意图:

 因为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表示半满hash表。轻负载hash表冲突少、适合插入与查询的特点(但是使用iterator迭代元素时比较慢)

  hash表有一个负载极限,负载极限是一个0-1的数值,"负载极限"决定了hash表的最大填满程度。当hash表中的负载因子达到了极限负载时,hash表会自动成倍增加容量(桶的数量),并将原来的对象重新分配,放入新的桶内,这成为rehashing.

  HashSet和HashMap、Hashtable的构造器允许指定一个负载极限。比如指定负载极限为0.75,表明当负载因子达到0.75时,hash表将会发生rehashing。负载极限是时间和空间成本上的折中:较高的负载极限可以降低hash表的所占的存储空间;较低的负载极限会提高查询数据的性能,但会增加hash表内存开销。

原文地址:https://www.cnblogs.com/weststar/p/12586220.html