HashMap面试

1:HashMap原理
时间复杂度:
O(1):常数级: 最低级别复杂程度,无论数据多大,使用时间或者空间不变,hash算法就是
O(log n): 对数级:二分查找法
O(n):线性级: 大部分遍历都是线性级别
O(nlog n):线性对数级
O(n²):平方级
O(n³):立方级
O(2ⁿ):指数级

数组特点:
特点:区间连续,占用内存严重,空间复杂大
优点:读取速度快,时间复杂为O(1)
缺点:插入和删除数据效率低,因插入数据,这个后面的数据在内存中要后移,且固定大小,不易动态扩展
链表特点:
特点:区间离散占用内存宽松,空间复杂小,时间复杂度O(n)
优点:插入快,内存利用率高,没有大小固定,扩展灵活
缺点:不能随机查找,每次都是从第一个开始遍历
1.7:数组+链表
同一hash值得链表都存储在一个链表里.但是当位于一个桶中元素过多,hash值相等得元素较多时候,通过key依次查找效率较低.
1.8:数组+链表+红黑树
当链表长度大于阈值8时转成红黑树,大大减少查找时间
实现原理:
红黑树构建原则:
1:节点是红色或者黑色
2:根节点是黑色
3:所有叶子节点是黑色:
3:每个红色节点的两个子节点都是黑色
4:任一一个节点到每个子节点路径都包含相同的黑色节点

默认初始化容量是16,默认加载因子是0.75.当底层数组容量打到75%就开始扩容,初始化的两倍.
首先每一个元素都是链表得数组,当添加一个元素时,就首先计算元素key的hash值,以此确定插入数组的位置,但是相同的hash值就会放到同一hash值的后面,就形成了链表过长就变成红黑树
当链表数组的容量超过初始容量的0.75时,再散列将链表数组扩大2倍,把原链表数组搬移到新的数组中.

1:为什么需要使用加载因子
2:为什么需要扩容

PUT(K,V)步骤:
1:将k,v封装到Node对象当中(节点)
2:调用底层用K的hashCode()方法得出hash值
3:通过hash算法将hash值转换成数组的下标,如果下标位置没有任何元素,就把Node添加到节点.
如果位置有链表就拿着K和链表每个节点K进行equal.如果所有的equals方法返回false就加到这个链表末尾,如果其中一个equals返回了true,那么这个节点value将被覆盖
map.get(k)实现原理:
1:通过调用K的hashCode方法得到,通过哈希算法 转成数组下标
2:看当前位置是否存在链表没有就返回null,如果有链表就遍历当前链表,再比较K的equals方法,如果有true就返回当前的value.
HashMap和Hashtable区别:
前者线程不安全,可以接受null,有fail-fast机制,有其他线程修改了结构,里面抛出异常.迭代器(Iterator)
不能保证随着时间推移Map中元素次序不变.
后者线程安全,不接受nulll,迭代器(Enumeration)
但是一般用ConcurrentHashMap,扩展性更高ConcurrentHashMap同步性能更好,因为它仅仅根据同步级别对map的一部分进行上锁

我们能否让HashMap同步?
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: HashMap是Java中的一个常用数据结构,它的底层是由hash数组和单向链表实现的。每个数组元素都是一个链表,通过Node内部类实现了Map.Entry接口来存储键值对。HashMap通过put和get方法来存储和获取数据。\[1\] 在重写equals方法时,我们需要同时重写hashCode方法。这是因为在HashMap中,查找value是通过key的hashCode来进行的。当找到对应的hashCode后,会使用equals方法来比较传入的对象和HashMap中的key对象是否相同。因此,为了保证正确的查找和比较,我们需要同时重写equals和hashCode方法。\[2\]\[3\] HashMap在什么时候进行扩容呢?当HashMap中的元素数量超过了负载因子(默认为0.75)与当前容量的乘积时,就会进行扩容。扩容是为了保持HashMap的性能,因为当元素数量过多时,链表的长度会变长,查找效率会下降。扩容的过程是创建一个新的数组,将原数组中的元素重新分配到新数组中,然后将新数组替换为原数组。\[3\] #### 引用[.reference_title] - *1* *2* *3* [史上最全Hashmap面试总结,51道附带答案,持续更新中...](https://blog.csdn.net/androidstarjack/article/details/124507171)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值