java 一层一层_Java的HashMap一层一层深入

本文探讨了HashMap和HashTable在Java中关键区别,包括对null值的支持、线程安全性、容量调整机制以及为何使用wrapper类作为key。还介绍了如何利用它们的特性,如不可变性和自定义key的要求。

HashMap和HashTable的区别

HashMap可以存储键值为Null的值。

HashTable不能存储键值为Null的值。

HashMap是非同步的,是线程不安全的。

HashTable是同步的,是线程安全的。

HashMap默认大小为16,并且一定为2的指数。

HashTable默认大小为11,并且增长规律为old*2+1。

HashMap的工作是什么原理

put()方法,先使用hashcode()方法计算key的hashcode,然后根据hashcode找到bucket位置,存储Entry对象,如果hashcode和其他的相同,那么使用Linklist,依次存储entry。

get()方法,使用hashcode()方法得到key的hashcode,然后遍历LinkedList使用key.equal()找出bucket中的具体entry,最后得到值。

什么HashMap的默认容量和负载因子(load factor)

默认容量为16,负载因子为0.75。

如果HashMap超过了负载因子,这时候该怎么办?

调用 rehash方法,将默认容量变为2倍的bucket数组,将原来的bucket数组元素放入心得bucket数组中。

为什么使用Double Integer等wrapper 类当做key比较好。

wrapper类有不可变性的性质,即放入和取出的hashcode不会改变,而且已经重写了equals和hashcode方法。并且如果两个不相等的对象返回不同的hashcode的话,那么碰撞的几率就会小些,这样就能提高HashMap的性能。

可以使用自定义对象作为key吗?

可以的,满足两个特性:不可变性和重写两个方法。

当对象插入到Map中之后将不会再改变了。并且重写equals和hashcode方法即可。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值