首页 > 编程语言 >Java面试小练(三)

Java面试小练(三)

时间:2023-11-27 17:37:11浏览次数:35  
标签:扩容 Java HashMap 小练 数组 链表 面试 线程 哈希

  1. 聊一聊HashMap底层的数据结构及扩容机制 ?
  • 数据结构

HashMap是一个双链集合,集合中的每个元素是以键值对的形式存在,HashMap的特点是无序,不重复,无索引

HashMap底层数据结构在JDK1.7之前是数组+链表,而在JDK1.8之后是数组+链表+红黑树

HashMap主要依赖于哈希表(数组)来存储,数组中的每个位置都可以存放一个键值对,数组的索引是通过键的哈希码经过哈希函数计算出来的,这样可以通过键快速定位到数组的某个位置。

在实际使用中,可能会遇到两个不同的键计算出相同的哈希值,这就是“哈希冲突”,HashMap通过使用链表来解决这个问题,当哈希冲突发生的时候,HsahMap会在冲突的位置,增加一个链表,新的元素会添加到链表的末尾,每个链表中的元素都包含了相同哈希值的键值对,所以在查找元素的时候,如果遇到哈希冲突,HashMap需要进行一次线性查找

而在JDK8之后,链表的长度超过默认的阈值8,总数据量大于64的时候。那么链表就会转换成红黑树。

  • 扩容机制

    Java7情况下的扩容

HashMap在初始化的时候,会有会有一个默认的初始容量(16),默认的加载因子(0.75),也就是说当HashMap的存储大小超过容量*加载因子,也就是12的时候,HashMap会进行扩容,新的容量是原来的两倍。

但是注意的是,发生扩容除了满足大小超过阈值外,还需要发生Hash碰撞,也就是说当没有发生hash碰撞的时候,理想情况下最后存满16个值,再存入第17个的时候才发生扩容现象

除此之外还要一种情况,前11个值全部发生hash碰撞,全部存取到数组的同一个地方,再次存入第12个元素不会发生扩容,此时12个元素全部在同一个链表中,数组剩余15个位置是空的,后面存入的15个值全部分散到数组剩下的15个位置。所以12+15=27,在存入第28个值的时候才会发生扩容

Java8情况下的扩容

Java8中扩容只需要满足一个条件,Java8只需要满足一个条件,当前存放值的时候,已有的元素个数大于等于阈值,下一次存放必定触发扩容

(先存放后扩容)

2.请描述一下如何创建一个线程池,线程池的7个参数分别是什么意思?

corePoolSize:线程池核心线程大小

maximumPoolSize:线程池最大线程数量

keepAliveTime:空闲线程存活时间

unit:空闲线程存活时间单位

workQueue:工作队列

threadFactory:线程工厂

handler:拒绝策略

标签:扩容,Java,HashMap,小练,数组,链表,面试,线程,哈希
From: https://www.cnblogs.com/yifan0820/p/17859865.html

相关文章

  • JAVA替换replaceAll方法报错:Illegal group reference
     Exceptioninthread"main"java.lang.IllegalArgumentException:Illegalgroupreference atjava.util.regex.Matcher.appendReplacement(Matcher.java:857) atjava.util.regex.Matcher.replaceAll(Matcher.java:955) atjava.lang.String.replaceAll(String......
  • 秦疆的Java课程笔记:41 流程控制 打印九九乘法表
    打印九九乘法表:1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*......
  • Discuz3.5版本整合Java 登录
    1.下载Discuz下载:官网Discuz-api-for-java下载:蓝奏云2.配置1.登录ucenter后台,应用管理,新建一个应用。以上配置uCenter如果能访问到http://172.16.22.103:13000/api/uc.php,就会显示通信成功2.修改Java配置运行testLogin()方法,如果不出意外会得到一个js代码,例:<scripttype="text/......
  • 关于Java内存模型
    (面试被问到,想到之前有个笔记,整理一下发出来。)内存模型可以理解为在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。不同架构的物理机器可以拥有不一样的内存模型,而Java虚拟机也有自己的内存模型。Java内存模型(JavaMemoryModel,JMM)是来屏蔽各种硬件和操作系统......
  • Typescript和Javascript的区别是什么?一文带您了解Typescript排名飙升的原因!
    看见了github上2023年编程语言的排行榜,Java竟然被typescript挤出了前三!Javascript的登顶得益于node.js 的出现,使js实现了在前后端的技术栈统一。那typescript为何又能在三足鼎立中占据一席之地呢?本文就对typescript进行一下概要介绍,本文并未涉及typescript的具体语法,注重分析Javas......
  • JavaWeb实现文件上传下载
    JavaWeb中实现文件上传下载使用jar包:smartupload.jar,该包封装了IO流的操作,如果使用Java自带的IO操作会比较繁琐文件上传的基本步骤@WebServlet(urlPatterns="/uploads",name="UploadServlet")//创建文件上传对象SmartUploadsmartupload=newSmartUpload();//初始化上传操......
  • geoserver指定JAVA_HOME路径
    /geoserver/bin/startup.sh修改这个启动文件的配置#GuardagainstmisconfiguredJAVA_HOMEif[-n"${JAVA_HOME:-}"]&&[!-x"${JAVA_HOME}/bin/java"];thenecho"TheJAVA_HOMEenvironmentvariableissetbutJAVA_HOME/bin/java&quo......
  • 【Java基础】面向对象
    关键字this关键字当前类对象的引用(地址)this构造方法的使用场景:super关键字代表父类存储空间的标识如果被调用的成员变量|成员方法在子类中不存在,那么"super."可以省略,而且本质上省略的是"this.",因为子类已经继承了父类的成员变量和成员方法。static关键字静态,修饰......
  • 分享一套适合二开的JAVA开源版本MES系统
    1、系统概述:万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES。1.万界星空开源MES制造执行系统的Java开源版本。开源mes系统包括系统管理,车间基础数据管理,计划管理,物料控制,生产执行,质量管理,库存管理,看板管理,数据分析等主体功能模块......
  • JavaWeb实现简单的文件上传和下载
    一、文件上传1.1文件上传的简单实现前端的标签介绍①需要一个<form>表单标签,请求方式为post请求PS:因为get请求时url有长度限制,而带有文件上传的url一般会超出get请求的长度限制,所以只能用post②<form>标签中需添加enctype属性,属性值必须为multipart/form-dataenctype属性:enc......