HashMap与HashTable的区别以及HashMap的底层原理

1.区别:

(1)HashMap没有synchronized修饰,线程是不安全的,建议使用ConcurrentHashMap;而HashTable是线程安全的,但是效率很低

(2)HashMap允许key和value为null,而HashTable不允许

2.HashMap的底层实现:数组加链表

从jdk8开始,当链表的高度达到8,数组长度超过64,链表转为红黑树(因为链表过长会影响查询速度),元素以内部类Node节点存在

  • 计算key的hash值,二次hash然后对数组长度取模,对应到数组下标
  • 如果没有产生hash冲突(下标位置没有元素),则直接创建Node存入数组
  • 如果产生了hash冲突,先进行equals比较,若相同则取代该元素,若不同则判断链表高度插入链表,如果链表高度达到8,并且数组长度达到64则转变为红黑树。当链表高度低于6时则将红黑树转回链表。
  • key若为null,则存储在下标为0的位置

数组扩容

  • 什么时候扩容:当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值,即当前数组的长度乘以扩容因子的值的时候,就要自动扩容啦。
  • 扩容(resize)就是重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的长度,以便能装入更多的元素。当然Java里的数组是无法自动扩容的,方法是使用一个新的数组代替已有的容量小的数组。
  • 扩容是一个特别耗性能的操作,所以当程序员在使用HashMap的时候,估算map的大小,初始化的时候给一个大致的数值,避免map进行频繁的扩容。HashMap默认大小是16
相关推荐
DB菜鸟13 分钟前
Grafana Username password invalid
java·服务器·grafana
2401_8582861119 分钟前
L11.【LeetCode笔记】有效的括号
c语言·开发语言·数据结构·笔记·算法·leetcode·
程序员老王wd20 分钟前
java xml 文本解析
xml·java
IT猿手27 分钟前
多目标优化算法:多目标黑翅鸢算法(MOBKA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码
开发语言·算法·matlab·多目标优化·多目标优化算法
天才少女爱迪生29 分钟前
python程序对服务器cpu和内存资源占用的管理。
服务器·开发语言·python
薇远镖局37 分钟前
python re模块 详解
开发语言·python
葛狂的博客44 分钟前
【Qt实现虚拟键盘】
开发语言·qt·计算机外设
yyqzjw1 小时前
【qt】控件
开发语言·qt
ChinaRainbowSea1 小时前
3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)
java·spring boot·后端·spring·spring cloud·eureka
石牌桥网管1 小时前
用正则表达式检查是IP否为内网地址
java·c++·golang·正则表达式·php·c