HashMap 和 Hashtable区别的底层原理
一、容器键值对:
1.HashMap 的 key 和 value 都允许为 null , HashMap 在 key 为 null 的时候,值必须为null。
2.Hashtable 的 key 和 value 都不允许为 null 。 Hashtable 遇到key或value为 null时 ,将抛出 NullPointerException异常 。
二、容量设定与扩容机制:
1.HashMap 默认初始化容量为 16,并且容器容量一定是 2 的 n 次方。当元素数量达到容量和加载因子(加载因子LoadFactor,默认为0.75)的乘积时会触发扩容,并且是以原容量 2 倍 的方式 进行扩容。
2.Hashtable 默认初始化容量为 11。
在元素数量达到容量和加载因子(加载因子默认是0.75)的乘积时会进行扩容,是以原容量 2 倍 再加 1 的方式进行扩容。即 int newCapacity = (oldCapacity << 1) + 1; 。
三、存储位置:
1.HashMap 是先将 key 键的 hashCode 经过扰动函数扰动后得到 hash 值,然后再利用 hash & (length - 1) 的方式(由于 HashMap 的容器容量一定是 2 的 n 次方,所以可以使用 hash & (length- 1) 的方式代替取模的方式计算元素的位置从而提高运算效率)代替取模,得到元素的存储位置。JDK 1.8之后HashMap引入了红黑树来优化链表过长的问题。
2.Hashtable 是使用除留余数法进行计算存储位置的(因为其默认容量不是2 的 n 次方,故无法用位运算替代模运算), int index = (hash &0x7FFFFFFF) % tab.length; 。
四、线程安全:
1.HashMap 不是线程安全,如果想线程安全,可以通过调用Collections.synchronizedMap(Map<K,V> m) 使其线程安全。或使用 ConcurrentHashMap 容器以同样达到线程安全。
2.Hashtable 是线程安全的,每个操作方法都有 synchronized 修饰使其同步,但运行效率不高,所以建议使用 ConcurrentHashMap 容器以达到线程安全。
3.总结:
1)Hashtable 是一个古老的容器,如果我们不需要线程同步,则可以使用HashMap ,如果需要线程同步,则可以使用 ConcurrentHashMap 。
2)HashMap不是同步的,所以性能会比Hashtable要高。
五、遍历及访问
1.HashMap和Hashtable都支持使用Iterator进行遍历。但是,Hashtable还额外支持使用Enumeration进行遍历,但此方式已过时。
2.HashMap 的迭代器(Iterator)是 fail-fast 的。如在迭代过程中需要修改 HashMap的结构,除了通过迭代器的 remove() 方法是安全的之外,调用其他方法都会抛出 ConcurrentModificationException 异常。
Hashtable 的迭代器不是 fail-fast 的。
3.HashMap迭代顺序不确定。Hashtable迭代顺序按照插入顺序进行。
4.Hashtable保留了containsKey、containsValue、contains三个方法,用于检查是否包含某个键、值或键值对。
HashMap去掉了contains方法,只保留了containsKey和containsValue两个方法。
六、其他
1.HashMap继承自AbstractMap,实现了Map、Cloneable、Serializable接口。
2.Hashtable继承自Dictionary,实现了Map、Cloneable、Serializable接口。
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。
欢迎关注。助您在编程路上越走越好!
相关文章:
HashMap 和 Hashtable区别的底层原理
一、容器键值对: 1.HashMap 的 key 和 value 都允许为 null , HashMap 在 key 为 null 的时候,值必须为null。 2.Hashtable 的 key 和 value 都不允许为 null 。 Hashtable 遇到key或value为 null时 ,将抛出 NullPointerException…...
代码随想录35期Day32-Java
Day32题目 LeetCode122.买股票的最佳时机 核心思想:很简单,只要第二天比第一天贵,就第一天买入,第二天卖出 class Solution {public int maxProfit(int[] prices) {// 只要后一天比这一天价钱高就买,然后第二天卖出…...

ROS 2边学边练(45)-- 构建一个能动的机器人模型
前言 在上篇中我们搭建了一个机器人模型(其由各个关节(joint)和连杆(link)组成),此篇我们会通过设置关节类型来实现机器人的活动。 在ROS中,关节一般有无限旋转(continuous),有限旋转…...
【第66例】IPD体系进阶:华为IPD发展历程
目录 简介 样例 作者简介 简介 想要引入 IPD,首先就要思考一些问题: 跟我的企业适配吗? 流程会不会太重了? 一定要引入吗,有没有其他方式? 从目前大的环境来说。 中国制造业正在由“中国制造”向“中国创造”转变。 这也是企业价值转移的趋势。 宏碁集团创始人施振…...

websevere服务器从零搭建到上线(四)|muduo网络库的基本原理和使用
文章目录 muduo源码编译安装muduo框架讲解muduo库编写服务器代码示例代码解析用户连接的创建和断开回调函数用户读写事件回调 使用vscode编译程序配置c_cpp_properties.json配置tasks.json配置launch.json编译 总结 muduo源码编译安装 muduo依赖Boost库,所以我们应…...
C语言笔记10
1.用指针打印一维数组 //1.用指针打印一维数组 #include <stdio.h> int main() {//int arr[] { 1,2,3,4,5 };int arr[5] { 0 };int* p &arr[0];int sz sizeof(arr) / sizeof(arr[0]);for (int i 0; i < sz; i){scanf("%d", &arr[i]);}//int* …...
BMS-HiL主要功能
BMS HIL 系统中 PC 机中安装实验管理软件用于测试过程管理和测试序列编辑,通过以太网与 PXI 机箱中的处理器进行连接,处理器中运行实时系统(Real Time)并安装 Veristand 终端引擎,通过与 PC 中的数据传输,对…...

idea无法识别加载pom.xml文件
有时idea无法识别加载pom.xml文件,直接打开pom.xml文件,然后添加到maven就行...
C语言笔记12
1.使用qsort函数进行排序 #include <stdio.h> #include <stdlib.h> #include <string.h>//void qsort(void* base, //指向待排序数组的第一个元素的指针 // size_t num, //base指向数组中的元素个数 // size_t size,//base指向的数组中一…...
说一下 hibernate 的缓存机制?
Hibernate 的缓存机制是为了提高应用程序的性能,通过减少对数据库物理数据源的访问频次而设计的。Hibernate 的缓存主要可以分为两个级别:一级缓存(也称为 Session 级别的缓存)和二级缓存(也称为 SessionFactory 级别的…...

Mac安装jadx
1、使用命令brew安装 : brew install jadx 输入完命令,等待安装完毕 备注(关于Homebrew ): Homebrew 是 MacOS 下的包管理工具,类似 apt-get/apt 之于 Linux,yum 之于 CentOS。如果一款软件发布时支持了 homebrew 安…...

风扇开启执行逻辑
执行流程 public static void businessExecutionWork(){//以下为业务逻辑部分System.out.println("1、根据电池包控制风扇服务执行 开始!");//1、获取电池包电压、电流、环境温度//获取电池包电压、电流、环境温度ObtainBatteryDataService obtainBatteryDataServic…...
调用函数实现数组的输入排序插入与输出
输入一串数字,输出排序插入后输出最后的数字序列; 把主要步骤交给主函数,通过调用函数来实现整体的功能: 写出主函数(这里使用冒泡排序): int main(){int n;int a[10];cin>>n;inputa(a…...

代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树
代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树 文章目录 代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树343. 整数拆分一、动态规划二、贪心(不需要掌握) 96.不同的二叉搜索树一…...

多模态产品在智能文档处理应用的展望------以TextIn模型为例
前言发展现状TextIn 文档解析技术文本向量化展望合合信息 前言 第十四届视觉与学习青年学者研讨会(VALSE 2024)于5月5日-7日在山城重庆渝北区悦来国际会议中心举办。大会聚焦计算机视觉、模式识别、多媒体和机器学习等领域的国际前沿和热点方向。大会中,合合信息智能…...
上海市计算机学会竞赛平台2024年3月月赛丙组最近的数字
题目描述 给定两个正整数 𝑛n 与 𝑑d ,请找到所有最接近 𝑛n 且是 𝑑d 的倍数的整数。 输入格式 第一行:单个整数表示 𝑛n第二行:单个整数表示 𝑑d 输出格式 若干行…...

RFID在汽车制造中的应用如何改变行业
随着工业4.0和中国制造2025的推进,企业对于智能化、自动化的需求日益增长,RFID射频技术在制造业中已经相当普遍了。在如今这瞬息万变的行业与时代中,RFID技术可以帮助企业获得竞争优势,简化日益复杂的生产流程,推动企业…...

sCrypt受邀在中国人民大学举办《区块链与数字经济》课程讲座
4月17日,可一科技特邀美国sCrypt公司的开发工程师周全,在中国人民大学的《区块链与数字经济》课程上进行了讲座。周全讲解了区块链的分布式设计、不可篡改特性,以及智能合约的基本原理,利用“智能家居触发机制”等生动比喻&#x…...
pc端的鼠标箭头变换
<div style"cursor:pointer"></div>...

ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2
ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2 1、 for i in range(5):Dev.step(9 - i * 2)Dev.turnLeft()2、 for i in range(3):Spaceship.step(i 1)Spaceship.turnRight()Spaceship.step(i 1)Spaceship.turnLeft()3、 for i in range(4):Dev.step(10 - i…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...