一、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(扩容)方法:不是同步的,在扩容过程中,会生成一个新容量的数组,然后对原数组的所有键值对,重新进行计算和
写入新的数组,之后指向新生成的数组。