HashMap面试题1

HashMap与HashTable的主要区别在于线程安全性和key空值处理。HashMap在JDK1.7使用数组+链表,JDK1.8引入红黑树,解决哈希冲突。负载因子为0.75是为了兼顾空间利用率和冲突减少。当链表长度超过8时,HashMap会将链表转换为红黑树。面试中还会讨论HashMap的线程不安全性以及解决方案,如ConcurrentHashMap和同步包装器。
摘要由CSDN通过智能技术生成

HashMap面试题

转自:http://www.mayikt.com/

1、HashMap和HashTable的区别?

<1>、HashTable是线程安全的,不允许key为空,因为put方法上加上了synchronized,在方法体中,有代码判断如果key为空,则抛出异常;

<2>、HashMap线程是不安全的,允许key为空;

2、HashMap的key可以为空,这个key存放数组的那个位置上?

存放在到下标为零的位置,也就是数据的第一个位置上,只允许存放一个key为空的对象;

因为在方法hash(Object key)中,定义如下:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
所以,key为空时,存放在数组的第一个位置上;

3、HashMap是否允许存放自定义对象作为Key?

可以;因为在put(k,v)方法中,key定义了允许任何对象,
在hash(Object key)方法中,也定义了可以可以为任何对象

4、HashMap在JDK1.7和JIDK1.8之间有什么区别?(HashMap底层采用那种数据结构?)

<1>、JDK1.7底层采用数据+链表结构;
<2>、JDK1.8底层采用数据+链表结构+红黑树;

5、HashMap如何解决hash冲突的问题;

HashMap使用链表存放hash值相等内容不同的key,存放在同一个链表或者红黑树中;

6、HashMap的put方法地城是如何实现的?

<1>、判断key,如果为空,则存放在数组0;
<2>、默认Hashmap的初始容量是16,加载因子是0.75,大小是16*0.75=12,每次扩容是2倍;
<3>、根据key计算hash值,hash值取容量的模,得到数组下标位置;
<4>、如果hash值相等,但是内容不相等的情况,存放到同一个链表中;
<5>、如果当前size大于加载因子阀值,开始2倍扩容;
备注:1.8中,如果链表大于8的情况下,开始把链表转换为红黑树;

7、HashMap的加载因子为什么是0.75而不是其他呢?

hjh:折中方案,空间利用率高,冲突少,0.75最合适;

8、HashMap1.7中数组扩容死循环的问题,有了解吗?

HashMap1.7中数组扩容死循环有了解,resize(int newCapacity)
方法调用了transfer(newTable)方法;1.7采取了头插入法方式实现,在多线程操作时有可能出现死循环;
备注:头插入法就是把最新的冲突节点放在最前面;
尾插入法就是把冲突节点放在最后;

9、HashMap根据Key查询时间复制度是多少?

HashMap根据key直接计算hash值,取模得到index值,直接从数组中取数据;
如果index没有产生冲突,可以直接取数据,时间复杂度,是O(1);
若果index有产生了冲突,遍历链表,时间复杂度为O(n);
如果index有产生了冲突,并且转换为红黑树了,则时间复杂度是O(logn);

10、HashMap根据Key查询时间复制度是多少?

<1>、1.8的链表采用了尾插入发,
<2>、1.8解决了1.7的死锁问题;
<3>、1.8的链表长度大于8时,转换为红黑树;

11、HashMap1.8为什么需要加入红黑树?

如果index冲突过多,导致链表过长,查询会变慢,因为链表的时间复杂度是O(n);
为了解决链表查询慢的问题,如果链表长度大于8,并且数组容量大于64的情况下,
链表转换为红黑树,红黑树的时间复杂度是O(logn);

12、HashMap线程不安全,有哪些代替的方案吗?

<1>、ConcurrentHashMap,这个线程安全的,采用了分段锁,16段,一段一个锁;
<2>、Collections.synchronizedMap(map) 可以转换为线程安全的Map;

13、红黑树与链表的时间复杂度分别是多少?

红黑树是O(logn);
链表的是O(n);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值