HashTable源码简析

libc++ hashtable 源码简析 libc++ hashtable 源码简析本文分析的是 https://github.com/llvm-mirror/libcxx/ 中截止至 2016 年 1 月 30 日最新的 libc++。 libc++ 中, hashtable 的实现为链式结构。 在教科书中(Introduction To Algorithm 3rd Edition)中,介绍的实现是由一个数组作为buckets,每个数组 阅读详情

HashTable 数据结构是一种比较古老的 Dictionary 实现 ,大家常用的hashMap 是实现的AbstractMap。

HashTable 内部使用了Table[] 数组和Entry<K,V> 链表实现。

内部使用了synchronized 关键字保证线程安全,简单粗暴,但是有效。
若担心多线程环境下 hashTable 的阻塞 可以使用 ConcurrentHashMap

简单分析一下hashTable的源码。

public synchronized V put(K key, V value) {
    // Make sure the value is not null
    //判断value 不为空 否则抛出异常
    if (value == null) {
        throw new NullPointerException();
    }

    // Makes sure the key is not already in the hashtable.
    // 确保 key 没有保存在 hashTable  中,确定数组下标之后,遍历链表
    //比对hash值
    Entry<?,?> tab[] = table;
    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;
    @SuppressWarnings("unchecked")
    Entry<K,V> entry = (Entry<K,V>)tab[index];
    for(; entry != null ; entry = entry.next) {
        if ((entry.hash == hash) && entry.key.equals(key)) {
            V old = entry.value;
            entry.value = value;
            return old;
        }
    }
//若key 不存在hashtable中 新增加一个key
    addEntry(hash, key, value, index);
    return null;
}

synchronized 修饰 put 方法,使用了泛型;
首先检查value 如果为null 抛出nullpointexception
hashtable key 也不能为空,native的key.hash() 会直接抛出nullPointerException()

接着检查 key 是否已经存在于hashtable 中,通过确认table[] 数据下标之后,遍历 链表

链表遍历

 for(; entry != null ; entry = entry.next) {
        if ((entry.hash == hash) && entry.key.equals(key)) {
            V old = entry.value;
            entry.value = value;
            return old;
        }
    }

如果存在则返回 旧值

如果不存在 则

新建一个Entry

private void addEntry(int hash, K key, V value, int index) {
    Entry<?,?> tab[] = table;
    if (count >= threshold) {
        // Rehash the table if the threshold is exceeded
        rehash();

        tab = table;
        hash = key.hashCode();
        index = (hash & 0x7FFFFFFF) % tab.length;
    }

    // Creates the new entry.
    @SuppressWarnings("unchecked")
    Entry<K,V> e = (Entry<K,V>) tab[index];
    tab[index] = new Entry<>(hash, key, value, e);
    //  定位到数组下标之后,在链表头部插入一个Entry
    count++;
    modCount++;
}

//新建一个Entry 

protected Entry(int hash, K key, V value, Entry<K,V> next) {
    this.hash = hash;
    this.key =  key;
    this.value = value;
    this.next = next;
}

HashTable 数据结构比较老旧,但从HashTable 的源码分析可以更好的掌握 HashMap ConcurrentHashMap

C# Hashtable源码剖析 Hashtable实现一个哈希表(也叫散列表),将键映射到相应的值。任何非 null 对象都可以用作键。 阅读详情

相关推荐

STL源码剖析——散列表hashtable

与前面介绍的底层机制基于红黑树RB-Tree容器不同,本文介绍的是哈希表hash table,在SGI STL中,给出了底层机制基于哈希表的相关容器的介绍,这里介绍hash table的源码剖析,有利于对后面容器的理解。

关注校招求职,微信号:job_campus 2134

从源码角度简析 Hashtable、HashMap 和 LinkedHashMap

Hashtable 与 HashMap 不同点 相同点 LinkedHashMap 注意:此文原文均摘自 Sun jdkHashtable 与 HashMap不同点先看类的定义——除了接口的实现是相同的,我们可以看到继承的类是不同的,我们不妨打开 Dictionary 抽象类看一下我们可以看到红色箭头指向的地方,大致翻译一下就是 —— 注意:这个类已经过时了,新的实现应该去实现 Map 接口,而不

joker 676

源码分析——Hashtable

对于Hashtable,其实实际中用的不多,但是作为一个面试常考点,还是试着来研究一下这个集合类。 首先研究Hashtable,就要将Hashtable和HashMap放在一起比较,因为两者的功能类似且相近。Hashtable产生于JDK1.1,而HashMap产生于JDK1.2,HashMap产生的时间要比Hashtable晚。接下来我们来看一看Hashtable的继承体系: 其实通过对...

qq_41843697的博客 327

Hashtable 集合源码分析

Hashtable 使用的哈希表 + 链表来实现的Hashtable 采用的是 数组实现的哈希表 + 链表的结构来实现的。因为在方法上使用了 synchronized 所以是线程安全,但由于是重量级锁,锁的粒度过大,所以效率低下。在进行扩容时,新容量为旧容量的2倍 + 1,当然会检查移除的情况,最大不得超过 Integer.MAX_VALUE - 8。在插入元素和扩容时采用的都是头插法。谈谈和hashmap的区别。

weixin_45278293的博客 1294

数据标注工具:AiLabel.js实现标注 超详细教程 案例分享

背景:在前端开发过程中难免遇到针对图片的缩放平移;以及在图片上进行矢量数据、文本、标注的展示;如果你有上面的任何需求,恭喜你,找到组织了.... 在此背景下,AILabel.js出生了。 前面文章我们已经介绍过AiLabel.js了; https://blog.youkuaiyun.com/u012967771/article/details/113148527 npm下载地址:https://www.npmjs.com/package/ailabel github地址:https://github.com/d.

前端互助会 9365

深入理解 ABAP 中的 Fast Data Access:从 @itab 到 FOR ALL ENTRIES 的性能关键路径

ABAP性能优化的关键在于理解Fast Data Access(FDA)机制,它连接了应用服务器的内表与数据库运算。FDA允许将内表数据推送到数据库进行筛选、聚合等操作,是SELECT...FROM@itab语法的基础。开发者需注意:1)该语法可能在内置引擎或数据库执行;2)仅当SQL能力超出ABAP范围时才建议使用;3)需通过CL_ABAP_DBFEATURES检查数据库支持情况。合理使用FDA可优化批量数据处理,但滥用可能导致性能下降。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1269

《Java源码分析》:Hashtable

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。Hashtable类的实现也是基于“数组和链表”来实现的。

smart_an的专栏 623

CAPL未来发展方向展望

通过本文的学习,读者应该对CAPL的未来发展方向有了初步的了解。随着汽车电子系统的不断发展,CAPL也在不断演进,以支持更多的技术和应用场景。希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1182

Hashtable 描述及源码解析

/ 默认容量// 最大容量// 默认加载因子// 容量// 加载因子// 元素个数// 存储元素的数组// 修改次数// 内部类,哈希表的节点V value;

loushaoqi的博客 810

【PostgreSQL教程】PostgreSQL 特别篇之 语言接口Java

本篇教程的Java程序中开始使用PostgreSQL之前,需要确保在计算机上设置了PostgreSQL JDBC和Java。您可以检查Java教程以在计算机上安装Java。现在让本篇教程检查如何设置PostgreSQL JDBC驱动程序。

No8g攻城狮的博客 1753

ABB机器人刷功能选项全一篇就够——不怕丢失程序和IO配置数据

ABB机器人刷功能选项

m0_66701835的博客 1258

STL源码剖析:Hashtable

哈希表是一种数据结构,它提供了快速的数据插入、删除和查找功能。它通过使用哈希函数将键(key)映射到表中的一个位置来实现这一点,这个位置称为哈希值或索引。哈希表使得这些操作的平均时间复杂度为常数时间,即O(1)。哈希表使用哈希函数将键映射到一个固定大小的数组上。碰撞两个不同的键通过哈希函数得到了相同的索引。由于哈希表的大小是有限的,而键的数量可能非常多,所以碰撞是不可避免的。(1)线性探测:当发生碰撞时,线性探测会在哈希表中按线性顺序搜索下一个空闲位置。(2)二次探测。

_ 1425

【2DWT:2维离散小波变换(附Pytorch代码)】

图像信号具有非平稳特性,无法使用一种确定的数学模型来描述,而小波变换的多分辨率分析特性很好地解决了这个问题。小波变化的多分辨率特性使其既可以高效描述图像的平坦区域(低频信息、全局信息),也可以有效处理图像信号的局部突变(高频信息,即图像的边缘轮廓等部分)。小波变换在空域和频域同时具有良好的局部性,使其可以很好地聚焦到图像的任意细节。

NorthSmile的博客 1万+

Hashtable源码阅读

我们之前已经阅读过HashMap的源码了,我们知道Hashtable与HashMap都可以用来存储<K,V>键值对,但是HashMap相对高效,而Hashtable可以保证线程安全。那么接下来我们就一起深入Hashtable的源码来一探究竟。

js_tengzi的博客 253

【1.2】Costas环的基本原理概述

Costas环是一种用于载波恢复的相干解调技术,可直接从BPSK等抑制载波信号中恢复本地载波并完成解调。其核心结构包含同相/正交双支路处理,通过混频、低通滤波后,利用I/Q支路信号乘积进行相位误差检测,经环路滤波器调节VCO输出频率,实现载波同步。课程将重点讲解Costas环的MATLAB仿真实现、系统性能分析及FPGA开发,包括信号产生、频偏模拟、滤波器设计等模块,并通过AWGN信道和不同频偏条件下的测试验证系统性能。该技术无需单独提取载波,在数字通信系统中具有重要应用价值。

fpga/matlab/simulink算法仿真工程 450

黑猫带你学UFS协议第17篇:UFS安全模式详解(Secure Mode)

本文详细介绍了UFS协议中的安全模式,包括Erase, Discard, Purge和Wipe Device操作。Erase用于永久删除数据并确保无法恢复;Discard不保证数据清除;Purge类似于Sanitize,清除内部未映射的物理块数据;Wipe Device则是格式化设备。这些操作涉及逻辑单元、擦除单位、相关寄存器配置等,确保数据安全。" 126036669,12409270,MySQL 8.0 开窗函数详解,"['数据库理论', 'SQL']

黑猫奥利奥的博客 2559

【JDK源码】HashTable

***//**Hashtable被改变的次数,用于fail-fast机制的实现所谓快速失败就是在并发集合中,其进行迭代操作时,若有其他线程对其进行结构性的修改,这时迭代器会立马感知到,并且立即抛出ConcurrentModificationException异常,而不是等到迭代完成之后才告诉你(你已经出错了)*/

2501_90222999的博客 570

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

源码剖析_Hashtable 源码剖析

喜欢请点关注Hashtable简介HashTable同样是基于哈希表实现的,同样每个元素都是key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阈值)时,同样会自动增长。Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。Hash...

weixin_35628777的博客 193

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

HashTable源码解析

Hashtable简介      Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。     Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。     Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能...

qq_39241239的博客 225

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

HashTable类源码详解

一、源码分析 1.继承的父类&实现的接口 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable { 2.Entry节点类 /** * Hashtable bucket collision list entry * Entry节点类 */ privat

LYQ20010417的博客 982

HashMap及HashTable源码解析

2)若没有在table[i]位置找到相同的key,则添加key到table[i]位置,新的元素总是在table[i]位置的第一个元素,原来的元素后调用addEntry方法。//若没有在table[i]位置找到相同的key,则添加key到table[i]位置,新的元素总是在table[i]位置的第一个元素,原来的元素后移。//遍历table[i]位置的链表,查找相同的key,若找到则使用新的value替换掉原来的oldValue并返回oldValue。//计算在数组中的存储位置。

2401_88972074的博客 811

Java8 Hashtable 源码阅读

一、Hashtable 概述 Hashtable 底层基于数组与链表实现,通过 synchronized 关键字保证在多线程的环境下仍然可以正常使用。虽然在多线程环境下有了更好的替代者 ConcurrentHashMap,但是作为一个面试中高频的知识点,我们还是有必要了解一下其内部实现细节的。 1.1 内部属性 // 内部数组 private transient Entry&amp;amp;amp;amp;amp;amp;amp;lt...

点滴记录 1118

Hashtable源码深度解析以及与HashMap的区别【一万字】

基于JDK1.8对Java中的Hashtable集合的源码进行了深度解析,包括各种方法、扩容机制、哈希算法、遍历方法等方法,最后给出了Hashtable和HashMap的详细对比以及使用建议。

终生学习践行者 2269

HashMap和HashTable

hashMap基于哈希表,底层结果由数组实现,添加到map里的元素以 key-value的形式存储在数组中,在数组中key-value已一个实体的形式存储, 也就是继承至map接口中的entry,下图是map源码enrty。

Small_white_528的博客 1237
上一篇: 合同中心设计概要
下一篇: 精通Redis 1 - Redis概览 和基础数据结构
hamish-wu
博客等级 码龄15年 2814粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值