哈希表
折半查找的时间复杂度:O(log2n)
哈希表是如何添加数据的
1.计算哈希码(调用hashCode(),结果是一个int值,整数的哈希码取自身即可)
2.计算在哈希表中的存储位置 y=k(x)=x%11
x:哈希码k(x)函数 y:在哈希表中的存储位置
3.存入哈希表
(1)情况1:一次添加成功
(2)情况2:多次添加成功(出现了冲突,调用equals()和对应链表的元素进行比较,比较到最后,结果都是false,创建新节点,存储数据,并加入链表末尾)
(3)情况3:不添加(出现了冲突,调用equals()和对应链表的元素进行比较,经过一次或者多次比较后,结构是true,表明重复,不添加)
哈希表添加数据 很快
唯一无序
hashCode和equals的作用
hashCode():计算哈希码,是一个整数,根据哈希码可以计算出数据在哈希表中的存储位置
equals():添加时出现了冲突,需要通过equals进行比较,判断是否相同,查询时也需要使用equals()进行比较,判断是否相同。
如何减少冲突
1)哈希表的长度和表中的记录数的比例:装填因子
如果Hash表的空间远远大于最后实际存储的记录个数,则造成了很大的空间浪费,如果选取小了的话,则容易造成冲突。在实际情况中,一般需要根据最终记录存储个数和关键字的分布特点来确定Hash表的大小。还有一种情况是可能事先不知道最终需要存储的记录个数,则需要动态维护Hash表的容量,此时可能需要重新计算Hash地址
装填因子越小,空间越大,发生冲突的可能性越小,java中取到0.75,超过0.75需要进行扩容
Map
HashMap
采用Hashtable哈希表存储结构
优点:添加速度快 查询速度快 删除速度快
缺点:无序
LinkedHashMap
采用哈希表存储结构,同时使用链表维护次序
key有序(添加顺序)