【Java集合面试宝典】HashMap的put流程和特性?HashMap的扩容机制?原理— day08

目录

数组和链表分别适用于什么场景,为什么?

数组

链表

List和Set的区别

List和Map、Set的区别

HashMap 、HashTable 和TreeMap有什么区别?

hashmap的特性

HashMap和HashTable有什么区别?(必会)

JDK1.7到1.8HashMap发生了什么变化(底层)

谈谈ConcurrentHashMap的扩容机制

hashMap 中什么时候需要进行扩容,扩容方法 resize()又是如何实现的?

HashMap的扩容机制原理

HashMap的put方法


数组和链表分别适用于什么场景,为什么?

数组和链表都是数据结构中常见的数据类型,它们各自适用于不同的场景。

数组

数组是一种基本的数据类型,它是一个有序的、固定大小的数据集合,其中每个元素都有一个唯一的索引。数组的优点在于它的随机访问速度非常快,因为它的元素在内存中是连续存储的,可以通过索引快速访问。

适用场景:

数组适合查询多,增删少的场景;

链表

链表是一种基于指针的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表的优点在于它可以动态地添加、删除元素,不需要像数组一样预先分配固定大小的空间。

适用场景:

(1) 需要频繁插入或删除元素,因为链表的插入和删除操作只需要修改节点之间的指针,效率较高;


List和Set的区别

List:有序 按对象进入的顺序保存对象 可重复 允许多个Null元素 可以使用迭代器取出所有的元素 然后再逐一遍历各个元素 还可以使用get获取指定下标的元素

Set:无序 不可重复 最多允许一个Null元素 只能使用迭代器取出所有的元素 然后在逐一遍历


List和Map、Set的区别

List和Set是存储单列数据集合,Map是存储键值对这样的双列数据的集合

List中存储的数据是有序的,可以为空,并且值允许重复。

Map中存储的数据是无序的 它的键不允许重复的 但是值是允许重复的;可一个空键、多个空值。

Set中存储的数据是无顺序的,并且不允许重复,只有一个空元素。元素在集合的位置是由元素的hashcode决定 即位置是固定的(Set集合是根据hashcode来进行数据存储的 所以位置是

固定的但是这个位置不是用户可以控制的 所以对于用户来说set中的元素还是无序的)


HashMap 、HashTable 和TreeMap有什么区别?


hashmap的特性

  1. 允许空键和空值(但空键只有一个,且放在第一位)
  2. 元素是无序的,而且顺序会不定时改变
  3. key 用 Set 存放,所以想做到 key 不允许重复,key 对应的类需要重写 hashCode 和 equals 方法。
  4. 底层实现是 链表数组,JDK 8 后又加了红黑树。


HashMap和HashTable有什么区别?(必会)

区别:

(1)HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都经过synchronized修饰。

(2)因为同步、哈希性能等原因,HashMap的性能优于HashTable

(3) HashMap允许有null值的存在,在HashTable不允许有null值

(4)HashMap默认初始化数组的大小为16,HashTable为11。前者扩容时乘2,使用位运算取得哈希,效率高于取模。而后者为乘2加1,都是素数和奇数,这样取模哈希结果更均匀。


JDK1.7到1.8HashMap发生了什么变化(底层)

1.7底层是数组+链表 1.8底层是数组+链表+红黑树 加入红黑树的目的是提高HashMap插入和查询的整体效率

1.7链表插入使用的是头插法 1.8链表插入使用的是尾插法 因为1.8插入key和value需要判断链表元素个数 所以需要遍历链表统计元素个数 正好使用尾插法

1.7的哈希算法比较复杂 存在各种右移和与运算 1.8进行了简化 因为复杂的哈希算法的目的是提高散列性 来提供HashMap的整体效率 而1.8中新增了红黑树 所以可以适当简化哈希算法 节省CPU资源。


谈谈ConcurrentHashMap的扩容机制

1.7版本

  1. 1.7版本的ConcurrentHashMap是基于Segment分段实现的
  2. 每个Segment相当于一个小型的HashMap
  3. 每个Segment内部会进行扩容 和HashMap扩容逻辑类似
  4. 先生产新的数组 然后转移元素到新数组中
  5. 扩容的判读也是每个Segment内部单独判断的 判断是否超过阈值

1.8版本

  1. 1.8版本的ConcurrentHashMap不再基于Segment实现
  2. 当某个线程进行put时 如果发现ConcurrentHashMap正在进行扩容那么该线程一起进行扩容
  3. 如果某个线程put时 发现没有正在进行扩容 则将key-value添加到ConcurrentHashMap中 然后判断是否超过阈值 超过了则进行扩容
  4. 扩容之前先生成一个新的数组
  5. 在转移元素时 先将原数组分组 将每组分给不同的线程进行元素的转移 每个线程负责一组或多组元素转移工作


hashMap 中什么时候需要进行扩容,扩容方法 resize()又是如何实现的?

调用场景: 

1.初始化数组 table

2.当数组 table 的 size 达到阙值时进行扩容

实现过程:

通过判断旧数组的容量是否大于0来判断数组是否初始化过。

l如果小于0:进行初始化,判断是否调用无参构造器。

l如果大于0: 进行扩容,扩容成两倍(小于最大值的情况下),之后在进行将元素重新进行与运算复制到新的散列表中。

概括的讲:

扩容需要重新分配一个新数组,新数组是老数组的2倍长,然后遍历整个老结构,把所有的元素挨个重新hash分配到新结构中去。

PS:可见底层数据结构用到了数组,到最后会因为容量问题都需要进行扩容操作。


HashMap的扩容机制原理

当new HashMap():底层没有创建数组,首次调用 put()方法示时,底层创建长度为 16 的数组,jdk8 底层的数组是:Node[],而非 Entry[],用数组容量大小乘以加载因子得到一个值,一旦数组中存储的元素个数超过该值就会调用 rehash() 方法将数组容量增加到原来的两倍,专业术语叫做扩容。在做扩容的时候会生成一个新的数组,原来的所有数据需要重新计算哈希码值重新分配到新的数组,所以扩容的操作非常消耗性能. 默认的负载因子大小为 0.75,数组大小为 16。也就是说,默认情况下,那么当 HashMap中元素个数超过 16*0.75=12 的时候,就把数组的大小扩展为 2*16=32,即扩大一倍。

在我们 Java 中任何对象都有 hashcode,hash 算法就是通过 hashcode 与自己进行向右位移 16 的异或运算。这样做是为了计算出来的 hash 值足够随机,足够分散,还有产生的数组下标足够随机。


HashMap的put方法

HashMap是Java中常用的散列表数据结构,是基于 Hash 算法实现的。们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key.hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

如果添加新节点后,桶中节点的数量超过了阈值(默认为0.75),则需要进行扩容操作。扩容操作会将桶的数量翻倍,并将原来的节点重新分配到新的桶中。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】树的介绍

文章目录前言树的概念及结构树的概念树的表示树在实际中的运用二叉树的概念及结构二叉树的概念现实中的二叉树特殊的二叉树二叉树的性质二叉树的储存结构顺序存储链式存储写在最后前言 🚩本章给大家介绍一下树。树的难度相对于前面的数据结构来说,又高了…

ESP32设备驱动-HDC1080温度湿度传感器驱动

HDC1080温度湿度传感器驱动 文章目录 HDC1080温度湿度传感器驱动1、HDC1080介绍2、硬件准备3、软件准备4、驱动实现1、HDC1080介绍 HDC1080 是一款集成温度传感器的数字湿度传感器,可在极低功耗下提供出色的测量精度。 HDC1080 在很宽的电源范围内工作,是一种低成本、低功耗…

“提效”|教你用ChatGPT玩数据

ChatGPT与数据分析(二) 上文给简单聊了一下为什么ChatGPT不能取代数据分析师,本文我们来深入感受一下如何让GPT帮助数据分析师“提效”。 场景一:SQL取数 背景:多数数据分析师都要用SQL语言从数据库中提取数据&#x…

ctfshow web入门 命令执行29-33

1.web29eval()函数是把所有字符串当作php代码去执行,这题过滤了flag,使用通配符绕过过滤应该要注意文件中没有重名的文件,或一部分是一样的文件payload:cecho%20nl flag.php; #官方解法,反引号表示执行系统命令,nl为linux系统命令…

springboot智慧外贸平台

053-springboot智慧外贸平台演示录像2022开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件&#xff…

干货:浅谈主数据管理项目建设思路

“主数据是数据之源,是数据资产管理的核心,是信息系统互联互通的基石,是信息化和数字化的重要基础。 ——《主数据管理实践白皮书》” 近期,国家印发《数字中国建设整体布局规划》,提出数字中国建设的整体框架…

I2C协议简介 Verilog实现

I2C协议 IIC 协议是三种最常用的串行通信协议(I2C,SPI,UART)之一,接口包含 SDA(串行数据线)和 SCL(串行时钟线),均为双向端口。I2C 仅使用两根信号线&#xf…

Django 实现瀑布流

需求分析 现在是 "图片为王"的时代,在浏览一些网站时,经常会看到类似于这种满屏都是图片。图片大小不一,却按空间排列,就这是瀑布流布局。 以瀑布流形式布局,从数据库中取出图片每次取出等量(7 …

Educational Codeforces Round 145 (Rated for Div. 2) (A~E)

Problem - B - Codeforces 思路: 我们选择长度后,其特定长度会构成一个正方形,因为点与点距离大于1,所以偶数的正方形里面只能包含偶数的正方形,奇数的包含奇数。计算每个长度容纳最大点数: 发现cnt[0]1,…

WPF毛笔字实现过程

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

Python中生产者消费者模型

Python生产者消费者模型 一、消费模式 生产者消费者模式 是Controlnet网络中特有的一种传输数据的模式。用于两个CPU之间传输数据,即使是不同类型同一厂家的CPU也可以通过设置来使用。 二、传输原理 类似与点对点传送,又略有不同,一个生产…

能把爬虫讲的这么透彻的,没有20年功夫还真不行【0基础也能看懂】

前言 可以说很多人学编程,不玩点爬虫确实少了很多意思,不管是业余、接私活还是职业爬虫,爬虫世界确实挺精彩的。 今天来给大家浅谈一下爬虫,目的是让准备学爬虫或者刚开始起步的小伙伴们,对爬虫有一个更深更全的认知…

chatGPT爆火,什么时候中国能有自己的“ChatGPT“

目录 引言 一、ChatGPT爆火 二、中国何时能有自己的"ChatGPT" 三、为什么openai可以做出chatGPT? 四、结论 引言 随着人工智能技术的不断发展,自然语言处理技术也逐渐成为了研究的热点之一。其中,ChatGPT作为一项领先的自然语言处理技术…

【软件测试】基础知识第一篇

文章目录一. 什么是软件测试二. 测试和调试的区别三. 什么是测试用例四. 软件的生命周期五. 软件测试的生命周期一. 什么是软件测试 软件测试就是验证软件产品特性是否满足用户的需求。 那需求又是什么呢?在多数软件公司,会有两种需求,一种…

【vue3】小小入门介绍

⭐【前言】 首先,恭喜你打开了一个系统化的学习专栏,在这个vue专栏中,大家可以根据博主发布文章的时间顺序进行一个学习。博主vue专栏指南在这:vue专栏的学习指南 🥳博主:初映CY的前说(前端领域) &#x1f…

python自动发送邮件,qq邮箱、网易邮箱自动发送和回复

在python中,我们可以用程序来实现向别人的邮箱自动发送一封邮件,甚至可以定时,如每天8点钟准时给某人发送一封邮件。今天,我们就来学习一下,如何向qq邮箱,网易邮箱等发送邮件。 一、获取邮箱的SMTP授权码。…

new动态内库管理库学习

new文件是动态内存管理库的一部分,特别提供低层内存管理特性。 它包括bad_alloc, bad_array_new_length,nothrow_t,align_val_t类nothrow常量,以及函数 operator newoperator new[],operator deleteoperator delete[],get_new_han…

微信小程序登录注册页面

// login.js // 获取应用实例 var app getApp() var api require("../../utils/api.js")Page({data: {motto: zhenbei V1.0.0,userInfo: {},hasUserInfo: false,disabled: true,btnstate: default,username: ,password: ,canIUse: wx.canIUse(button.open-type.get…

Python实现人脸识别检测, 对美女主播照片进行评分排名

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 素材、视频、代码、插件安装教程我都准备好了,直接在文末名片自取就可点击此处跳转 开发环境: Python 3.8 Pycharm 2021.2 模块使用: requests >>> pip install requests tqdm >…

如何利用WDM波分复用技术来扩展光纤容量?

文章导读: 如何利用WDM来扩展光纤容量? 什么是Mux合波和Demux分波? CWDM, DWDM, OADM 了解WDM的常用波段 WDM技术:TFF和AWG WDM-PON应用于接入网 WDM网络拓扑在5G传输中的应用 网络提供商一直面临着如何应对不断扩大的带宽需求&a…