首页 > 其他分享 >HashMap深入学习

HashMap深入学习

时间:2023-07-31 18:35:21浏览次数:34  
标签:链表 HashMap HashSet TreeMap 学习 深入 key null

1.HashMap和HashTable的区别?

a.HashMap是线程不安全的,HashTable 是线程安全的。

b.HashTable不允许有null键和null值。

c.HashMap底层是数组+链表+红黑树,而HashTable底层是数组+链表。

d.HashMap默认的初始大小为16,每次扩容变为原来的2倍;HashTable默认初始大小为11,每次扩容后容量变为原来的2n+1。

2.HashMap和TreeMap的区别?

a.HahsMap是基于哈希表,而TreeMap是基于红黑树的;

b.HashMap的key可以是null,而TreeMap的key不能为null;

c.HashMap的key-value对是无序的,而TreeMap的key-value对是有序的。

d.HashMap的查找速度更快,而Treemap的查找速度更慢。

e.hashMap的实现比TreeMap更简单。

3.HashMap和HashSet的区别?

a.存储方式:HashMap是一个映射表,它存储的是键值对,而HashSet是一个集合,它存储的是单个的值。

b.元素的唯一性:HashMap中的key是唯一的,而value可以重复;而HashSet中的元素是唯一的,不能重复。

c.对null的支持:HashMap可以存储一个null键和多个null值,而HashSet最多存储一个null值。

d.底层数据结构:HashMap是基于哈希表实现的,而HashSet是基于HashMap实现的,底层也是使用哈希表。

e.使用场景:HashMap适用于需要通过键值对来查找元素的场景,而HashSet适用于需要存储唯一元素的场景。

4.为什么HashMap的默认负载因子是0.75?

a.因为阈值 = 负载因子 * 容量,为了保证阈值始终为整数,2的次幂乘以0.75始终为整数。

b.负载因子太小会导致频繁扩容,负载因子太大会导致Hash冲突的概率增大。

5.HashMap的put/get过程?

一、put的过程

a.对key的hashCode()做hash运算,计算index;

b.如果没有碰撞直接放到bucket里;

c.如果碰撞了,以链表的形式存在buckets后;

d.如果碰撞导致链表过长,就把链表转换成红黑树。

e.如果节点已经存在就替换old value。

f.如果bucket满了,就要resize。

二、get的过程

a.对key的hashCode做hash运算,计算index;

b.如果在bucket里的第一个节点里直接命中,则直接返回;

3.如果有冲突,则通过key.equals(k)去查找对应的Entry;

4.若为树,则在树中通过key.equals(k)查找;

5.若为链表,则在链表中通过key.equals(k)查找。

标签:链表,HashMap,HashSet,TreeMap,学习,深入,key,null
From: https://blog.51cto.com/u_16190226/6911191

相关文章

  • openGauss学习笔记-26 openGauss 高级数据管理-约束
    openGauss学习笔记-26openGauss高级数据管理-约束约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。如果存在违反约束的数据行为,行为会被约束终止。约束可以在创建表时规定(通过CREATETABLE语句),或者在表创建之后规定(通过ALTERTABLE语句)。约束可......
  • Oracle行锁处理学习
    (1)锁表查询的代码有以下的形式:selectcount(*)fromv$locked_object;select*fromv$locked_object;(2)查看哪个表被锁selectb.owner,b.object_name,a.session_id,a.locked_modefromv$locked_objecta,dba_objectsbwhereb.object_id=a.object_id;(3)查看是哪个sess......
  • three.js学习1(vue3)
    1.引入threejsnpminstall--savethree在组件内import*asTHREEfrom'three'2.创建容器创建canvas标签,为3D渲染建立容器<template><div><canvasid="three"></canvas></div></template>3.创建场景 Three.js依赖......
  • 鸟哥Linux私房菜学习笔记day5
    第十章4.Bashshell操作环境终端环境设置:sttyset登录终端时,自动获取的一些终端的输入环境的设置。stty[-a]set[-uvCHhmBx]echo$-可以显示目前所有的set设置值 通配符与特殊符号符号       意义*                 代表0到无穷多......
  • RocketMQ学习
    rabbitMQ(ons)特性0拷贝顺序写盘随机读  延迟消息事务消息 顺序消息(rabbit没有这个)基于nettynio框架NameServer代替Zookeeper,寻址方式,更轻量级。集群架构无单点,扩展性强。消息重试机制,消息查询(rabbit不支持重试)社区活跃、成熟度好 模型Producer ConsumerBroker......
  • web前端学习第一天
    一、web应用程序开发介绍    1.界面部份    2.业务逻辑部份    3.数据存储部份 二、 web应用程序开发三大核心技术   HTML CSS  JAVASCRIPT    html:超文本标记语言        作用:网页内容、结构    css:......
  • 程序员学习能力提升三要素
    IT技术的发展日新月异,新技术层出不穷,具有良好的学习能力,能及时获取新知识、随时补充和丰富自己,已成为程序员职业发展的核心竞争力。本文中,作者结合多年的学习经验总结出了提高程序员学习能力的三个要点。众所周知,现在是一个知识爆炸的时代,知识更新非常快。据测算,一个大学毕业生......
  • 机器学习从入门到放弃:Transfomer-现代大模型的基石
    一、前言随着ChatGPT的横空出世,全世界的目光都聚焦在了生成式AI上。本次将介绍Transformer的发展历史、基本原理,也是记录总结自己在学习路上的所得。首先我想聊聊NLP的发展路线,这样对于后面的transformer可能会有更好的理解。自从计算机诞生之初,让计算机理......
  • github学习笔记(九):分支管理策略
    合并的分支到底是如何管理的呢?分支的合并通常git使用Fastforward模式来合并分支,但是这种模式下一旦删除分支,信息也随之消失。如果强制禁用FastForward模式,git就会在merge时生成一个新分支,这样从分支历史上就可以看出分支信息。例子创建并切换分支、修改文件、提交新的com......
  • 【学习笔记】扫描线
    扫描线是用来求解图形面积并的一个算法。问题引入给定\(n\)个长方形,求它们的面积并。下面以两个长方形为例:对于这个问题,可以有容斥等做法,但是还有个更简单的方法——扫描线。扫描线扫描线,顾名思义,就是,拿一条“线”取扫(这里是从下往上扫,其实其它的扫的方式也是可以的):如图......