Java集合框架 -- 03 hash算法在集合中的应用及分析

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

hash表里可以存储元素的位置被称为“桶”(bucket),一般而言,单个桶里存储一个元素性能是最优的。但有时会
发生冲突,即两个元素的hash值一样,即它们计算出来的存储位置一样了,此时就要解决冲突问题,那么解决冲突的
方法主要有:

开放定址法
再散列函数法
链地址法(Java集合中采用的这种方式)
公共溢出区

hash表包含的属性:
容量(capacity): hash表中桶的数量
初始化容量:创建hash表时桶的数量。HashMap和HashSet都允许再构造器中指定初始容量
尺寸(size): hash表中当前的存储数量
负载因子(装填因子):"size/capacity"的比值,为0时,表示空的hash表,0.5表示半满的hash表
负载极限:是一个0-1的数值,决定了hash表的最大填满程度,当负载因子达到了指定的负载极限时,hash表会自动成倍的增加容量(桶的数量),并将原有的对象重新分配到新的桶内,这个过程为rehashing

注意:
    这个负载极限的取值会影响性能,过大过下都不好,一把取值0.75较为合理。过大虽然能降低hash表所占用的内存时间,但会增加
    查询数据的时间开销(因此,冲突多了,挂载的分支链表也就多了长了,从而查找性能不好);过小,尽管
    会提高查询性能,但容易发生rehashing,即增加hash表所占用的内存开销。

你可能感兴趣的:(Java集合框架 -- 03 hash算法在集合中的应用及分析)