HashMap面试题

一、HashMap的特点

1.使用HashMap定义的Map集合,是无序存放的(顺序无用);

2.如果发现了重复的key,会进行覆盖,使用新的内容替换旧的内容;

3.使用HashMap子类保存数据时,key或value可以保存为null。

二、提问:Map与Collection的区别是什么?

回答:Collection接口数据是为了输出,Map接口数据是为了查询。

首先,Collection与Map接口,都可以保存动态长短的数据,然而两者本质的区别在于其使用的环境。

Collection接口保存数据的主要目的是输出(利用Iterator接口),而Map保存数据的目的是实现key查找value的字典功

能,虽然Map也可以进行输出操作,但是这样的操作在开发中出现较少。

三、常见面试题分析:请解释HashMap与Hashtable的区别?

No.     区别点 HashMap      Hashtable

1     推出时间 JDK1.2推出,属于新的类        JDK1.0推出,属于旧的类

2     性能 采用异步处理              采用同步处理
3     数据安全 非线程安全              线程安全

4     设置null 允许key或value内容为null     不允许设置null

四、HashMap的负载因子

1.负载因子:尺寸/容量,空表的负载因子是0,而半满表的负载因子是0.5,依此类推。

2.再散列:使容量大致加倍,并重新将现有对象分布到新的桶位(bucket)集中。

3、HashMap使用的默认负载因子是0.75(只有当表达到四分之三满时,才进行再散列)。

五、HashMap的实现原理

1.HashMap需要一个hash函数,它使用hashCode()和equals()方法,来向/从集合添加和检索元素。当调用put()方法的时候,

HashMap会计算key的hash值(hashcode),然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新

成新值。

2.如果hashcode相同,则它们的bucket位置相同,“碰撞”会发生。因为HashMap使用LinkedList存储对象,这个Entry(包含

有键值对的Map.Entry对象)会存储在LinkedList中。

3.如果两个键的hashcode相同,如何获取值对象?当我们调用get()方法时,HashMap会使用键对象的hashcode,找到bucket

位置,然后获取值对象。如果有两个值对象储存在同一个bucket,将会遍历LinkedList直到找到值对象。

六、HashMap线程不安全的原因(多线程操作时,hash碰撞与扩容导致)

1.hash碰撞:put方法不是同步的,同时调用了addEntry方法(依然不是同步的)。

2.resize(扩容)方法:不是同步的,在扩容过程中,会生成一个新容量的数组,然后对原数组的所有键值对,重新进行计算和

写入新的数组,之后指向新生成的数组。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值