面试题系列-数据结构问题

Posted by 麦子 on Wednesday, 2020年06月24日

[TOC]

说明:以下文字来源网络各相关面试题目收集

HashMap

转载地址: https://zhuanlan.zhihu.com/p/43788113

好文:http://www.spring4all.com/article/16425

众所周知 HashMap 底层是基于 数组 + 链表 组成的,不过在 jdk1.7 和 1.8 中具体实现稍有不同。

Base 1.7

v2-13ba8b7d315270c587d1ca4f5e648ec9_720w

先来看看 1.7 中的实现。

v2-ec3c5d9b443b238c04764c4eab31e1c7_720w

这是 HashMap 中比较核心的几个成员变量;看看分别是什么意思?

  1. 初始化桶大小,因为底层是数组,所以这是数组默认的大小。
  2. 桶最大值。
  3. 默认的负载因子(0.75)
  4. table 真正存放数据的数组。
  5. Map 存放数量的大小。
  6. 桶大小,可在初始化时显式指定。

重点解释下负载因子:

给定的默认容量为 16,负载因子为 0.75。Map 在使用过程中不断的往里面存放数据,当数量达到了 16 * 0.75 = 12 就需要将当前 16 的容量进行扩容,而扩容这个过程涉及到 rehash、复制数据等操作,所以非常消耗性能。

因此通常建议能提前预估 HashMap 的大小最好,尽量的减少扩容带来的性能损耗。

Base 1.8

不知道 1.7 的实现大家看出需要优化的点没有?

其实一个很明显的地方就是:

当 Hash 冲突严重时,在桶上形成的链表会变的越来越长,这样在查询时的效率就会越来越低;时间复杂度为 O(N)。

因此 1.8 中重点优化了这个查询效率。

1.8 HashMap 结构图:

v2-3dbc3866a37adf4ac810661d695192d7_720w

集合删除为什么使用Iterator

转载地址:https://www.cnblogs.com/duanxz/p/4750345.html

「真诚赞赏,手留余香」

真诚赞赏,手留余香

使用微信扫描二维码完成支付