HashMap详解

HashMap面试详解

  • Java的集合容器包含哪些?

在这里插入图片描述

  • List、Set、Map的区别?

1、List、Set都是继承自Collection接口、Map则不是
2、List与Set的区别
(1)List特点:元素有放入顺序,可重复,Set特点:元素无放入顺序,元素不可重复,重复元素会被覆盖掉。(注:元素在Set中虽然无顺序,但是元素在Set中的位置是由其Hash Code值决定的,所以它的位置也是固定的。)
(2)List支持for循环遍历,Set只能用迭代器遍历。
(3)Set进行查询时效率低下,插入和删除效率噶,插入和删除不会引起元素位置的改变。List和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低。(注:如果特殊业务下,查询次数多,插入只插入尾部,则会使用List)
(4)list能存放null值,set只能存放一个null值。
3、Map适合存储键值对数据。
4、线程安全集合类与非线程安全集合类
(1)LinkedList、ArrayList、HashSet是非线程安全的;Vector、Stack、Hashtable。
(2)HashTabe是线程安全的,HashMap是非线程安全的。

  • 对HashMap的理解

数据结构:数组、链表、红黑树
存储结构:
每个位置最多一个元素时,查询效率最高,为O(1)
在这里插入图片描述
当一个位置有超过一个低于八个元素时,则该个位置会产生一个链表;当元素超过八个元素时,就会产生红黑树。
在这里插入图片描述

  • HashMap扩容机制

扩容条件:初始化长度16,负载因子为0.75(因为根据泊松分布,0.75是碰撞的几率最小)。
当容器元素个数大于阈值(数组长度*负载因子),自动扩容为原来的2倍。

HashMap的线程安全情况

HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。

那么如何能够安全的使用hashMap呢?
1、Hashtable
HashTable使用synchronized来保证线程安全的,所有线程竞争同一把锁,效率低
2.ConcurrentHashMap
使用cas算法,效率高
3、 Collections.synchronizedMap
调用synchronizedMap()方法后会返回一个SynchronizedMap类的对象,而在SynchronizedMap类中使用了synchronized同步关键字来保证对Map的操作是安全的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值