1. HashMap的put操作做了什么?
    HashMap的是由数组和链表构成的,JDK7之后加入了红黑树处理哈希冲突。put操作的步骤是这样的:

    1. 根据key值计算出哈希值作为数组下标。如果数组的这个位置是空的,把k放进去,put操作就完成了。
    2. 如果数组位置不为空,这个元素必然是个链表。遍历链表逐一比对value,如果value在链表中不存在,就把新建节点,将value放进去,put操作完成。
    3. 如果链表中value存在,则替换原节点的value,put操作完成。
    4. 如果链表节点数已经达到8个,首先判断当前hashMap的长度,如果不足64,只进行resize,扩容table,如果达到64就将冲突的链表为红黑树。
  2. 元素在数组中的位置怎么计算出来的
    采用数组长度与value的哈希值取与操作计算的,表达式:(n - 1) & hash,n是数组长度,hash是hash(value)。

  3. 红黑树有什么优势,为什么要将链表转成红黑树
    红黑树的平均查找长度是log(n),长度为8的时候,平均查找长度为3,如果使用链表,平均查找长度为8/2=4。链表长度如果是小于等于6,平均查找长度6/2=3,虽然速度也很快,但是转化为树结构和生成树的时间也会耗时。

  4. 什么情况下数组会扩容
    当元素个数超过数组长度 * loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75。默认情况下,数组大小为16,元素个数超过16 * 0.75=12的时候,就把数组的大小扩展一倍,即2 * 16 = 32,重新计算每个元素在数组中的位置,这是一个非常消耗性能的操作。

参考(部分摘抄的文字版权属于原作者):

https://www.jianshu.com/p/2c7a4a4e1f53
https://www.cnblogs.com/liwei2222/p/8013367.html
https://www.cnblogs.com/williamjie/p/9358291.html
https://www.cnblogs.com/xc-chejj/p/10825676.html

鸡汤:你全心全意的付出,还不如别人的随便搞搞。

面试连环炮系列(七):HashMap的put操作做了什么的更多相关文章

  1. 面试连环炮系列(二十三): StringBuffer与StringBuild的区别

    StringBuffer与StringBuild的区别 频繁修改字符串时,建议使用StringBuffer和StringBuilder类.StringBuilder相较于StringBuffer有速度 ...

  2. 面试连环炮系列(二十一):你们的项目怎么使用kafka

    你们的项目怎么使用kafka? 我们采用kafka进行日志采集,准确点说是ELK方案,即elasticsearch + logstash + kibana + kafka.通过Spring AOP的方 ...

  3. 面试连环炮系列(三):synchronized怎么用的

    synchronized怎么用的? 用过,synchronized是常用的并发控制关键字,简单的说就是访问加锁.它可以修饰静态方法或者一个类的class对象,这叫类锁:可以修饰普通方法或者代码块,这叫 ...

  4. 面试连环炮系列(十):一个线程调用两次start会怎么样

    一个线程调用两次start会怎么样 Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常. 谈谈线程的生命周期和状态转移 新 ...

  5. 面试连环炮系列(十二):说说Atomiclnteger的使用场景

    说说Atomiclnteger的使用场景 AtomicInteger提供原子操作来进行Integer的使用,适合并发情况下的使用,比如两个线程对同一个整数累加. 为什么Atomiclnteger是线程 ...

  6. 面试连环炮系列(二十):TCP的滑动窗口协议是什么

    TCP的滑动窗口协议是什么 滑动窗口协议,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组.由于发送方不必每发一个分组就停下来等待确认,因此该协议可以 ...

  7. 面试连环炮系列(十五):说说Eureka的高可用方案

    说说Eureka的高可用方案 至少3个Eureka实例才能满足高可用,配置方法如下: 准备三个节点node1,node2,node3. 在每个实例的application.xml文件里加入 eurek ...

  8. 面试连环炮系列(十四): HTTP状态码302的跳转逻辑

    HTTP状态码302的跳转逻辑 302状态码表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地 ...

  9. 面试连环炮系列(八):服务器CPU飙升100%怎么排查

    服务器CPU飙升100%怎么排查 执行"top"命令,查看当前进程CPU占用的实时情况,PID列是进程号,确定是哪个应用程序的问题. 如果是Java应用导致的,怎么定位故障原因 执 ...

随机推荐

  1. Linux目录结构-中部

    第1章 /proc目录下 1.1 /proc/cpuinfo 系统cpu信息 [root@nfsnobody ~]# cat /proc/cpuinfo                  一般常用的是 ...

  2. 将String类型转换为int整数类型

    示例如下: public class demo { public static void main(String[] args) { String s="10"; 6 7 //St ...

  3. The place where I want to go

    The place where I want to go It’s hard to say where I want to go most. Because there are too many pl ...

  4. 正则grep 使用介绍

    第6周第3次课(4月25日) 课程内容: 9.1 正则介绍_grep上9.2 grep中9.3 grep下扩展把一个目录下,过滤所有*.php文档中含有eval的行grep -r --include= ...

  5. 链式栈-C语言实现

    相对于顺序栈的空间有限,链式栈的操作则更加灵活 #include<stdio.h> #include<malloc.h> typedef int SElemType; //元素 ...

  6. List接口下的集合

    集合框架 List接口下的集合特点: Set接口下的集合特点: 1.都是有序的 1.都是无序的 2.都有下标 2.没有下标 3.都可以重复 3.不可重复(覆盖) List接口下的集合 1.ArrayL ...

  7. 【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick

    目录 Event Loop 是什么? Event Loop 基本解释 事件循环阶段概览 事件循环细节 timers pending callbacks poll阶段 check close callb ...

  8. 洛谷 3111 [USACO14DEC]牛慢跑Cow Jog_Sliver 题解

    本蒟蒻又来发题解了, 一道较水的模拟题. 题意不过多解释, 思路如下: 在最开始的时候求出每头牛在t秒的位置(最终位置 然后,如果后一头牛追上了前一头牛,那就无视它, 把它们看成一个整体. else ...

  9. 使用Docker测试静态网站

    参考书籍 :第一本docker书[澳]James Turnbull  1.Sample网站的初始Dockerfile 文件目录如下: Dockerfile文件代码: 安装nginx 在容器中创建一个目 ...

  10. 开放下载 | 《Knative 云原生应用开发指南》开启云原生时代 Serverless 之门

    点击下载<Knative 云原生应用开发指南> 自 2018 年 Knative 项目开源后,就得到了广大开发者的密切关注.Knative 在 Kubernetes 之上提供了一套完整的应 ...