很多时候,一提到map,大家应该都会想都它是Key-Value的集合,那么在map前面加上hash呢?没错就是hashmap,有兴趣的朋友们可以跟小编一起来看看有关hashmap的相关面试题。
第一题:HashMap 里面index 冲突与hash冲突有哪些区别?
答:Index冲突就是应为底层做二进制运算的产生了相同的index,对象不同了,但二进制运算时相同的index,就是对象不同了,但是二进制运算还是相同的index;
Hash冲突了,对象不同但是HashCode是相同的,在HashMap里面为了确保相同的key使用 equals。
第二题:Index冲突了的话会一般存在哪些问题?
答:中会导致值被覆盖掉的,所以在这个时候使用链表解决。
第三题:同一个链表中存放了哪些内容?
答:Index冲突或者hash值冲突。
第四题:HashMap 中链表使用单项还是双向?
答:单项的。
第五题:如何HashMap中链表长度过长会存在哪些问题?
答:会导致整个查询效率降低 ,时间复杂度为O(n)
第六题:HashMapKey为空的情况,底层是如何存放?
答:存放在第一个链表或者数组为0。
第七题:JDK7中HashMap存在哪些问题?
答:HashMap线程不安全 ,链表如果过长导致查询效率降低 ,底层扩容的时候可能存在死循环的问题
第八题:JDK 7中的HashMap 会根据复杂度为多少?
答:这要分两种情况:
一是如果该key没有发生hash冲突的,就可以直接根据key计算index直接从数组中查询,时间复杂度为O(1);
二是如果该key存在Hash冲突了,就会形成一个链表,查询的效率会比较低 时间复杂度为O(n);
Jdk7中的HashMap计算hash值非常均摊,减少了hash值的冲突问题,因为链表的查询效率是非常低的;
JDK里面HashMap 计算Hash 是非常简单的,存在hash冲突的概率比JDK7HashMap 计算的hash要大一些,JAVA8就引用了红黑树;查询效率 是远远大于链表的。
第九题:HashMap默认情况下每次扩容多少倍?
答:每次扩容2倍
第十题:为什么加载因子为0.75而不是其他呢?
答:因为加载因子越大,index下标的冲突概率就也就越大,反而 空间利用率会比较高;
那么加载因子越小 ,index下标冲突概率就也越小,反而是空间利用率不会很高了;
如果说index下标冲突越高,反而查询的成本非常高,反之就非常低了;
这就必须在冲突的机会与空间利用率里面直接寻找一种平衡了。
第十一题:HashMap是否可以存放自定义对象做为key?
答:可以。
第十二题:HashMap默认情况下每次扩容多少倍呢?
答:每次是扩容2倍。
好了,以上就是有关hashmap的所有有关内容了,还想了解更多面试题信息记得多多关注本站消息获取哦。
推荐阅读: