哈希表(二)

1.哈希表HashMap使用不当时无法发挥性能!
(1)假设将所有的HashCode()方法返回值固定为某个值,那么会导致底层哈希表变成了纯单向链表,这种情况我们称为散列分布不均匀。
什么是散列均匀:
假设有100个元素,10个单向链表那么每个单向链表上有10个节点,这是最佳情况
(2)假设将所有的HashCode()方法返回值都设定为不一样的值,那么会导致底层变成纯一维数组,没有链表得概念,也是散列不均匀
(3)散列分布均匀需要重写hasCode()方法时有一定得技巧。
(4)重点:放在hasMp()集合key部分的元素,以及放在hashSet集合中的元素,需要同时重写hasCode和equals方法。
2.同一个单向链表上的节点的Hash值相同,因为他们的数组下标是一样的,但是同一个链表上的k和k的equals方法肯定返回false,都不相等。
放在HashMap集合的k部分元素,以及放在HashSet集合中的元素需要同时重写hashCode()和equals()
3.HashMap集合的默认初始化容量是16,默认加载因子是0.75,这个默认加载因子是当数组容量达到75%时,开始扩容。
HashMap集合初始化容量必须是2的倍数,这也是官方推荐的,这是因为达到散列均匀,为了提高HashMap集合的存取效率
4.向Map集合中存,以及从Map集合中取,都先调用key的HashCode()方法,在调用equals方法
用put(k,v)举例,什么时候不会调用equals方法?
k.hashCode()方法返回哈希值,哈希值经过哈希算法转换成数组下标,数组下标位置上如果是null,则不需要执行(get(k)方法原理同上)
5.如果一个类的equals方法重写,那么HashCode()方法也必须重写,并且equals方法返回true,hashCode()返回值也必须相同
equals方法返回true,表示两个对象相同,在同一链表上比较,那么对于同一个单向链表上的节点来说,他们的哈希值都素hi相同的,所以hashCode()返回值也应该相同
6.对于HashMap在JDK8之后有新的改进:如果哈希表单向链表中的元素超过8个,单向链表这种数据结构就会变成红黑树数据结构,当红黑树上的节点少于6个时,会重新把红黑树变成单向链表。
7.hashMap()的key部分是否可以为空?
可以,但是只允许有一个null,否则会覆盖
8.hashTable()的key和value是否可以为空?
不能
9.HashTable的初始化容量是11,默认加载因子是0.75f,扩容是:原容量 * 2 + 1
10.HashSet集合初始化容量是16,初始化容量建议是2的倍数,扩容之后是原容量的2倍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值