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 会根据复杂度为多少
分两种情况:
1.如果该key没有发生hash冲突的话,可以直接根据key计算index直接从数组中查询,时间复杂度为O(1)

2.如果该key存在Hash冲突问题会形成一个链表 ,查询效率会非常低 时间复杂度为O(n)


Jdk7中的HashMap计算hash值非常均摊 ,减少hash值冲突问题,因为链表的查询效率非常低
JDK8中HashMap 计算Hash 非常简单 ,存在hash冲突的概率比JDK7HashMap 计算的hash要大 ,JAVA8引用了红黑树
查询效率 远远大于链表
 

HashMap默认情况下每次扩容多少倍
     每次扩容2倍

为什么加载因子为0.75而不是其他呢
 加载因子越大,index 下标冲突概率也就越大 反而 空间利用率是非常高的;
 加载因子越小 ,index下标冲突概率越小 ,反而空间利用率不是非常高;
如果index下标冲突越高,反而查询的成本非常高,反之非常低
因此必须在冲突的机会与空间利用率直接寻找一种平衡与折中

HashMap是否可以存放自定义对象做为key

   可以

HashMap默认情况下每次扩容多少倍
     每次扩容2倍


HashMap在并发的情况下,扩容的时候会存在哪些问题
在多线程的情况下,同时对HashMap实现扩容
因为在JDK1.7版本使用链表头插赋值法,在 多线程的情况下会导致一个死循环的问题
在 JDK1.8 的时候已经解决了该问题;
JDK1.7
原理分析:因为每次数组在扩容的时候,新的数组长度发生了变化,需要重新计算index值,需要将原来的table 中的数据移动到新的table中

e.next = newTable[i]; 
目的获取当前index在新table中是否存在index冲突问题 
直接改变原来的next关系;导致出现脏读的数据

ArrayList 根据下标查询的情况下,时间复杂度为多少o(1)
ArrayList 根据内容查询的情况下,时间复杂度为多少 o(n)

ArrayList  底层基于数组实现
LinkeList 底层基于链表实现 

LinkeList 根据下标查询的情况下,时间复杂度为多少o(n)
LinkeList 根据内容查询的情况下,时间复杂度为多少 o(n)

jdk1.7

Hashmap根据key查询的情况下,时间复杂度为多少o(1)或者o(n)
总结原理,直接通过数组下标查找到元素的情况下o1

二分法查询效率非常高
二分法查询存在哪些问题呢,必须保证有序的问题。

二叉搜索树存在哪些问题
使用我们第一次添加的节点作为根节点,如果后面的添加节点值都大于根节点的值的情况下会造成链表

发布了47 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_34233080/article/details/105677161