HashSet保证元素唯一原理以及HashMap扩容机制
Posted zfablog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashSet保证元素唯一原理以及HashMap扩容机制相关的知识,希望对你有一定的参考价值。
一、HashSet保证元素唯一原理: 依赖于hashCode()和equals()方法
1、唯一原理:
1.1 当HashSet集合要存储元素的时候,会调用该元素的hashCode()方法计算哈希值
1.2 判断该哈希值对应的位置上,是否有元素
1.3 如果该哈希值位置上没有元素,那么就直接存储该元素
1.4 如果该哈希值位置上有元素,那么就产生了哈希冲突
1.5 如果产生了哈希冲突,就得调用该元素的equals()方法,和该位置上的所有元素进行一一比较:
如果有任何一个元素与该元素相等,那么就不存储该元素;
如果没有一个元素与该元素相等,那么就直接存储该元素。
2、补充:
Object类: hashCode()和equals()方法
hashCode():Object类中的hashCode()方法是根据地址值计算哈希值
equals方法():Object类中的equals()方法是比较地址值
3、哈希表底层结构:
HashSet集合存储元素的数据结构:哈希表
哈希表:
(1)jdk8以前:数组 + 链表
(2)jdk8以后:如果元素没有超过8个:数组 + 链表
如果元素超过8个:数组 + 链表 + 红黑树
二、HashMap扩容机制
Threshold(开始扩容的临界点)=Size(HashMap的容量)*Load_Factor(负载因子)
当HashMap中的元素个数超过数组大小(数组总大小length,不是数组中个数size)*loadFactor时,就会调用resize方法进行数组扩容,loadFactor的默认值为0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中元素个数超过16*0.75=12(这个值就是代码中的threshold值,也叫做临界值)的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置。至于为什么是0.75?这是大量实验得出的结果。如果取0.5,超过一般就扩容,造成资源的浪费;如果取1,到临界值才扩容,会增加哈希碰撞的几率。
以上是关于HashSet保证元素唯一原理以及HashMap扩容机制的主要内容,如果未能解决你的问题,请参考以下文章