HashMap和HashTable 源码分析

本文详细对比了HashTable与HashMap在同步性、对null的支持、初始值及扩容方式、哈希值计算、数组角标计算等方面的差异。揭示了两者在多线程环境下性能表现的不同,以及在Java集合框架中的应用特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 同步性

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

HashTable中所有的方法都是加了synchronize关键字,线程是同步的,所以每次调用方法都需要排队,效率非常低!!一般多线程情况下 用的是ConcurrentHashMap,因为它是对方法内部的局部代码块进行同步(也就是分块同步),效率远大于HashTable


2. 对null key和null value的支持不同


在这里插入图片描述


在这里插入图片描述

如图HashMap在计算 key的哈希值时,如果key为null默认为0,否则是当前key的哈希值和自己的高十六位进行与运算(因为int为32位,高,低十六都参与运算可以使得哈希散列更加均匀)。HashTable在传入Key和Value时,key和value为空都会抛出空指针异常。因为空指针不能调用方法。


3.初始值和扩容方式不同


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

HashMap的初始容量是16,而HashTable是11。当都达到阈值时(容量*负载因子) HashMap以2的倍数进行递增,而HashTable是以2的倍数+1扩容。

4.计算哈希值的方法不同


在这里插入图片描述


在这里插入图片描述


HashMap是key为null时,哈希值为0,否则为key的哈希值与上自己的高16位。而HashTable是直接获取到key的哈希值


5. 数组中角标的位置的计算不同


在这里插入图片描述


在这里插入图片描述

HashMap中通过数组的长度减一与上哈希值,而Hashtable是通过去掉符号位对数组长度进行取模运算


6. HashMap是在put操作时才创建的数组(防止内存浪费),而HashTable是在构造函数初始化时就创建了数组


在这里插入图片描述


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值