Map相关面试答案(都是简单版

一、HashMap的扩容机制

在1.7中
1、先生成新数组
2、遍历老数组中每个位置上的链表的所有节点
3、取每个节点的key,计算出每个元素在新数组中的下标,并添加到新数组中,这里用的是头插法
4、转移完毕后将新数组复制给hashMap的table属性

1.7中扩容的问题,使用的是头插法,扩容后改变链表顺序可能引起链表节点死循环。

在1.8中
1、先生产新数组
2、遍历老数组每个位置上的链表或者红黑树
3、遍历链表/红黑树里的每个元素,计算在新数组中的下标位置,使用尾插法
4、这里在插入时,如果该位置的元素超过8,就生成一个新的红黑树,并将根节点添加到新数组的相应位置。如果没超过8,就生成一个链表,并将链表的头节点添加到新数组的响应位置。
5、所有元素转移后,将新数组赋值给hashMap的table属性

链表大于8/数组大于等于64时转成红黑树,红黑树小于6转成链表。

为什么是8:泊松分布。

二、HashMap的put

1、根据key通过哈希算法和与运算计算出数组下标
2、如果数组下标为空,将key和value封装成Entry对象,1.8中是Node对象,并放入该位置
3、如果数组下头节点不为空,分情况讨论
3.1、1.7中,需要判断是否扩容,如果要扩容就进行扩容,不扩容就生成Entry,头插法插入到链表中。
3.2、1.8中,会先判断当前数组的是红黑树还是链表

  • 如果是红黑树,就将key和value封装成一个Node,添加到红黑树中,如果红黑树有这个key,就修改这个node的value,否则就插入。
  • 如果是链表,遍历链表,使用尾插法插入,如果链表此时长度大于等于8,需要转成红黑树。
    4、在插入后,也需要判断是否需要扩容。

二、hashmap和hashtable的区别

hashmaphashtable
非线程安全线程安全
key和value可以为nullkey不可以为null
继承自abstractMap继承自directory
数组+链表实现哈希表实现,默认size=11

三、LinkedHashMap

1、维护一条双向链表,就是在hashMap的基础上,链表/红黑树的节点都有一个前后指针,指向上次插入的节点和下次插入的节点。
2、适合LRU算法,最近最少使用
3、迭代顺序和插入顺序一样,插入较hashmap效率低

四、TreeMap extend AbstractMap

1、继承
2、红黑树实现,返回有序的key
3、在创建时需要提供comparator来排序

五、ConcurrentHashMap

1、在hashmap的基础上增加并发安全,数据结构和hashmap一样。
2、多线程并发扩容:多个线程对原始数组进行分片,每个线程进行一片数据的迁移。
3、

  • 1.7中,使用的是分段锁,segemnt,将一个范围内的数组元素放一块,锁的时候一起锁,基于ReentrantLock重入锁的实现。
  • 1.8 用CAS volatile synchronized通过对头节点加锁,锁的粒度变小。

ConcurrentHashMap 和hashtable都是线程安全的有什么区别

ConcurrentHashMaphashTable
ConcurrentHashMap的锁性能比hashtable好hashtable是锁一整个表的
ConcurrentHashMap的迭代器支持边迭代边修改hashtable不支持迭代时修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android OpenCV 概述、优缺点及应用场景分析

摘要 随着移动设备性能的不断提升,安卓平台上的计算机视觉应用日益增多。OpenCV作为一个开源的计算机视觉库,在安卓开发中扮演了重要角色。本文将对安卓OpenCV进行概述,并深入探讨其优缺点以及在不同场景下的应用,为开发者提供参考…

u盘为什么一插上电脑就蓝屏,u盘一插电脑就蓝屏

u盘之前还好好的,可以传输文件,使用正常,但是最近使用时却出现问题了。只要将u盘一插入电脑,电脑就显示蓝屏。u盘为什么一插上电脑就蓝屏呢?一般,导致的原因有以下几种。一,主板的SATA或IDE控制器驱动损坏…

Unable to open connection to “Oracle, Microsoft provider V1.0.5000.0“

这是使用vs2018运行vb.net项目时遇到的问题,Navicat可以正常连接oracle但是项目启动却连接不了数据库报了这个错,网上找了很久,没有找到解决方案,最后发现是少了个东西叫 Oracle Client for Microsoft Tools 19c 官网下载地址&a…

VUE中如何使用 JavaScript 变量来设置CSS变量,从而修改CSS属性 --color 的值

// Vue 组件&#xff08;组件名称&#xff1a;DataView&#xff09; <template><div :style"{ --mycolor: color }">这是一个带有自定义颜色的元素</div> </template><script setup lang"ts">const props defineProps({ tit…

C语言处理文本模板:格式信函编程

开篇 本篇文章的问题来源为《编程珠玑》第3章其中一个问题&#xff0c;格式信函编程。说白了就是先在文件中定义一个文本模版&#xff0c;然后使用数据库中的数据去填充这个模版&#xff0c;最后得到填充后的文本&#xff0c;并输出。 问题概要 在常去的网店键入你的名字和密码…

Harmony鸿蒙南向驱动开发-SPI接口使用

功能简介 SPI指串行外设接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。SPI是由Motorola公司开发&#xff0c;用于在主设备和从设备之间进行通信。 SPI接口定义了操作SPI设备的通用方法集合…

页表缓存TLB原理

处理器的内存管理单元(Memory Management Uint&#xff0c;MMU)负责把虚拟地址转换成物理地址&#xff0c;为了加快虚拟地址到物理地址的转换速度&#xff0c;避免每次转换都需要查询内存中的页表&#xff0c;处理器厂商在MMU中增加了一个高速缓存TLB(Translation Lookaside Bu…

算法练习第16天|101. 对称二叉树

101. 对称二叉树 力扣链接https://leetcode.cn/problems/symmetric-tree/description/ 题目描述&#xff1a; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#x…

详解QActionGroup类的使用

QActionGroup 是 Qt 框架中用于管理一组相关 QAction 对象的类。它主要用于实现互斥选择&#xff08;即单选&#xff09;或多选&#xff08;即复选&#xff09;的行为&#xff0c;特别是在菜单、工具栏或上下文菜单中&#xff0c;当存在一系列相互排斥或相关联的操作选项时&…

【Python面试题收录】什么是堆?什么是栈?栈和堆的区别是什么?

一、堆和栈的定义 &#xff08;1&#xff09;堆&#xff08;Heap&#xff09; 数据结构&#xff1a;堆是一种特殊的完全二叉树&#xff0c;满足父节点的值总是大于或等于&#xff08;大根堆&#xff09;其子节点的值。也可以是总是小于或等于&#xff08;小根堆&#xff09;其…

品牌百度百科词条创建多少钱?

百度百科作为国内最具权威和影响力的知识型平台&#xff0c;吸引了无数品牌和企业争相入驻。一个品牌的百度百科词条&#xff0c;不仅是对品牌形象的一种提升&#xff0c;更是增加品牌曝光度、提高品牌知名度的重要途径。品牌百度百科词条创建多少钱&#xff0c;这成为了许多企…

玻璃生产线 Web 组态应用案例介绍

玻璃生产线组态可视化 概述 随着工厂信息化、数字化发展&#xff0c;智慧生产车间成为必然发展趋势&#xff0c;通过智能硬件、物联网、大数据等智慧化技术与手段&#xff0c;提高车间生产设备、工艺设备的智能执行能力&#xff0c;从而提升整个车间乃至工厂的智能化、网络化与…

【SpringBoot XSS存储漏洞 拦截器】Java纯后端对于前台输入值的拦截校验实现 一个类加一个注解结束

先看效果&#xff1a; 1.js注入拦截&#xff1a; 2.sql注入拦截 生效只需要两步&#xff1a; 1.创建Filter类&#xff0c;粘贴如下代码&#xff1a; package cn.你的包命.filter; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IO…

macos 查看 远程服务器是否开放某个端口

想要使用mac查看远程服务器某个端口是否开发&#xff0c;可通过 nc 命令&#xff0c;如下&#xff1a; nc -zv <服务器IP> <端口号>如果该端口开发&#xff0c;结果为&#xff1a;succeeded! Connection to <服务器IP> port <端口号> [类型] succeed…

CLion 2024:为Mac与Win打造的卓越跨平台集成开发环境

CLion 2024作为一款跨平台IDE&#xff0c;CLion 2024不仅完美支持Mac和Windows两大操作系统&#xff0c;更在细节之处展现了其出色的跨平台兼容性。无论你是在Mac的优雅界面下工作&#xff0c;还是在Windows的实用环境中编程&#xff0c;CLion 2024都能为你提供一致且流畅的开发…

Day98:云上攻防-云原生篇K8s安全Config泄漏Etcd存储Dashboard鉴权Proxy暴露

目录 云原生-K8s安全-etcd(Master-数据库)未授权访问 etcdV2版本利用 etcdV3版本利用 云原生-K8s安全-Dashboard(Master-web面板)未授权访问 云原生-K8s安全-Configfile鉴权文件泄漏 云原生-K8s安全-Kubectl Proxy不安全配置 知识点&#xff1a; 1、云原生-K8s安全-etcd未…

对SQL主键优化策略收录

1. 主键选择 类型选择&#xff1a;主键应当尽可能短小且高效。通常推荐使用整数类型&#xff08;如INT或更小的SMALLINT、TINYINT&#xff09;&#xff0c;尤其是带有自增属性&#xff08;AUTO_INCREMENT&#xff09;的整数&#xff0c;这样既能保证唯一性&#xff0c;又能减少…

Springboot实现链路追踪功能

前言 在日常开发中&#xff0c;一个业务的实现往往会调用很多个方法&#xff0c;当我们去看日志的时候&#xff0c;各种接口的日志打印出来&#xff0c;看着就头疼&#xff0c;压根没办法去定位&#xff0c;而链路追踪就能很好的帮助我们去查看接口从头至尾依次调用了哪些方法…

vue小程序跳转页面携带参数

跳转携带对象 前一个页面&#xff1a;跳转的方法里把数组转成字符串 gotoArea(item){console.log("item",item)let datas JSON.stringify(item);goto.goto(navigateTo,index/area/main?itemdatas);},跳转的目标页面&#xff1a; onLoad(options){let datas JSO…

MacOS13搭建安卓逆向环境

MacOS中用apktool解包 这里是所有链接&#xff1a;123云盘下载 https://www.123pan.com/s/9QRqVv-JE7Y.html安装apktool https://apktool.org/docs/install/ 或者下载单独的jar包 brew install wgethttps://apktool.org/blog/apktool-2.9.3下载直链&#xff1a;https://co…