HashMap和HashTable浅谈

两者都实现了Map接口,基本特性相同

-          对同一个Key,只会有一个对应的value值存在

-          如何算是同一个Key? 首先,两个key对象的hash值相同,其次,key对象的equals方法返回真

1、 HashMap的数据结构:

162213_hnAN_989269.png

当我们往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。 如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。

2、HashTable的数据结构:

162259_hD99_989269.png

其基本内部数据结构是一个Entry数组 (transient Entry[] table)

-          数组元素为实现Map.Entry<K,V>接口的类,Hashtable和HashMap各自实现了自己的Entry类。

-          Entry包含一个Key-value对,以及一个next指针指向另一个Entry。多个Entry可以组成一个单向链表。

Iterator iter = temp.entrySet().iterator();
(iter.hasNext()) {
    Map.Entry entry = (Map.Entry)iter.next();
    Object key = entry.getKey();
    Object value = entry.getValue();
    System..(key.toString() + + value.toString() + + key.hashCode());
}

(HashMap的循环也可这么写)

3、HashTable和HashMap的继承

public class Hashtable extends Dictionary implements Map
public class HashMap  extends AbstractMap implements Map

4、常用操作

数据插入操作: put(key,value)

-          根据Key的hash值计算出该Entry所应存放的位置(数组下标)

-          若该数组元素为空,直接放置Entry到此处

-          若多个不同的Key所计算得到的数组下标相同,新加入的Key-value对(Entry)会被加入到Entry单向链表中。Hashtable和HashMap都是将其插入链表首部.

-          若已经有相同的Key存在于这个链表中,则,新的value值会取代老的value

-          当Map中存放的Entry数量超过其限制( 数组长度 * 负荷因子)时,Map将自动重新调整数组大小并重新对Entry进行散列

 

数据查找:get(key)

-          根据Key的hash值计算出该Entry对所应存放的位置(数组下标)

-          得到该位置的第一个Entry对象,比较key和Entry.key,若hash值相同,并且equals为真,则该Entry是我们要找的Key-value对,否则继续沿next指针构成的单向链表查找

 

数据移除:remove(key)

-          按照上述数据查找的方式找到key所在的Entry对象,将其移除,并保持Entry单向链表的连通性


Hashtable

HashMap

并发操作

使用同步机制,

实际应用程序中,仅仅是Hashtable本身的同步并不能保证程序在并发操作下的正确性,需要高层次的并发保护。

下面的代码试图在key所对应的value值等于x的情况下修改value为x+1

{

 value = hashTable.get(key);

   if(value.intValue()== x){

hashTable.put(key,      new Integer(value.intValue()+1));

   }

}

如2个线程同时执行以上代码,可能放入不是x+1,而是x+2.

没有同步机制,需要使用者自己进行并发访问控制

Map Collections.synchronizedMap(Map m)或者ThreadLocal

数据遍历的方式

Iterator 和 Enumeration

Iterator

是否支持fast-fail

用Iterator遍历,支持fast-fail

用Enumeration不支持fast-fail.

支持fast-fail

是否接受值为null的Key 或Value?

不接受

接受

根据hash值计算数组下标的算法

当数组长度较小,并且Key的hash值低位数值分散不均匀时,不同的hash值计算得到相同下标值的几率较高

 

hash = key.hashCode();

index=(hash&0x7FFFFFFF) % tab.length;

优于hashtable,通过对Key的hash做移位运算和位的与运算,使其能更广泛地分散到数组的不同位置

 

hash = hash (k);

index = indexFor(hash, table.length);

 

static int hash(Object x) {

 int h = x.hashCode();

h += ~(h << 9);

 h ^= (h >>> 14);

  h += (h << 4);

 h ^= (h >>> 10);

 return h;

}

static int indexFor(int h, int length) {

return h & (length-1);

}

 

Entry数组的长度

Ø         缺省初始长度为11,

Ø         初始化时可以指定initial capacity

Ø         缺省初始长度为16,

Ø         长度始终保持2的n次方

Ø         初始化时可以指定initial capacity,若不是2的次方,HashMap将选取第一个大于initial capacity 的2n次方值作为其初始长度

LoadFactor负荷因子

0.75


负荷超过(loadFactor * 数组长度)时,内部数据的调整方式

扩展数组:2*原数组长度+1

扩展数组: 原数组长度 * 2

两者都会重新根据Key的hash值计算其在数组中的新位置,重新放置。算法相似,时间、空间效率相同



一般情况下,HashMap能够比Hashtable工作的更好、更快,主要得益于它的散列算法,以及没有同步。应用程序一般在更高的层面上实 现了保护机制,而不是依赖于这些底层数据结构的同步,因此,HashMap能够在大多应用中满足需要。推荐使用HashMap,如果需要同步,可以使用同 步工具类将其转换成支持同步的HashMap。



辨析

 “Hashtable和HashMap的区别主要是前者是同步的,后者是快速失败机制保证不会出现多线程并发错误(Fast-Fail)。”,这是一个被很多文章转载过的概念,但其描述并不准确,容易引起误会。实质上,Fast-fail与同步保护的是两种不同情况下的并发,两者不能拿来做比较。

Hashtable是同步的,在执行get,put,remove,size,clear等一次性读写操作时,使用了同步机制,避免了多个线程 同时读写Hashtable。但同步机制并不能避免在iterator或Enumeration遍历过程中其他线程对Hashtable的put、 remove、clear操作,这些写操作都会被毫无阻拦得成功执行。

快速失败机制主要目的在于使iterator遍历数组的线程能及时发现其他线程对Map的修改(如put、remove、clear等),因 此,fast-fail并不能保证所有情况下的多线程并发错误,只能保护iterator遍历过程中的iterator.next()与写并发.

其次,Hashtable的iterator遍历方式也是支持fast-fail的,不能说它没有快速失败机制。写一个简单的例程就可以证明这 一点,一个线程做iterator遍历,另一个线程向hashtable中put新的key和value,很容易就会观察到fast-fail 机制报告 ConcurrentModificationException


转载于:https://my.oschina.net/cherryzhang/blog/600801

避开这些坑,你的Python爬虫才能稳定爬取IEEE Xplore(含反爬策略与MongoDB存储实战) 本文详细介绍了如何构建稳定的Python爬虫系统以爬取IEEE Xplore学术论文,包括反爬策略、MongoDB存储优化和断点续传机制。通过动态等待时间算法、请求头指纹管理和会话保持策略,有效应对IEEE的反爬机制。同时,优化MongoDB数据结构和索引,提升存储效率。最后,强调法律合规与伦理考量,确保爬虫合法合规运行。 阅读详情

相关推荐

AVM环视:系统搭建整体流程

文章目录前言一、畸变矫正鱼眼相机二、透视变换三、图像拼接四、图像融合总结 前言 由于正在做AVM环视,所以记录一下整个过程,归纳为一个系列文章,并对期间遇到的错误进行归纳整理。本文主要概括了AVM环视的大致流程和逻辑,不涉及代码部分,仅供思路参考,其中涉及的具体技术会在后期整理为小章节进行分析。 一、畸变矫正 鱼眼相机 做环视基本上使用到的是鱼眼照片,因为鱼眼相机的视角范围可以达到220°到230°,所以一个相机就可以采集到一个面的全部信息,例如汽车具有四个面,那么在汽车的前后左右分别安装一个鱼眼相机.

qq_34468890的博客 6529

[转载]hashmap hashtable 的区别

Hashtable 和 HashMap 做为 Map 的基本特性 两者都实现了Map接口,基本特性相同 - 对同一个Key,只会有一个对应的value值存在 - 如何算是同一个Key? 首先,两个key对象的hash值相同,其次,key对象的equals方法返回真 内部数据结构 Hashtable和HashMap的内部数据结构相似 ...

weixin_30475039的博客 230

51单片机独立按键控制LED(二)

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。独立按键控制LED显示二进制。独立按键控制LED灯亮灭。独立按键控制LED状态。独立按键控制LED移位。

m0_50562428的博客 5377

HashMap与Hashtable的区别

<br />Hashtable的应用非常广泛,HashMap是新框架中用来代替Hashtable的类,也就是说建议使用HashMap,不要使用Hashtable。可能你觉得Hashtable很好用,为什么不用呢?这里简单分析他们的区别。 <br />1.Hashtable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。<br />查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方

joehope的专栏 469

OpenSpec 从入门到精通:AI 时代的最佳 SDD 范式

同样都是「先写规范再写代码」的开源 SDD 框架,OpenSpec(https://github.com/fission-ai/openspec) 展现出了极高的工程性价比,无论是使用 Claude Code、Cursor 还是 Aider,都可以无缝接入 OpenSpec 的规格管理层。这些问题需要人来做判断,AI 做不了这个主。整个流程跑下来,OpenSpec 产出的效果还是令人满意的,一些前期没有考虑到的细节 AI 都补上了,生成的相关文档也有利于开发人员的知识对齐,可以尝试在团队内部推广。

qq_39093474的博客 912

优刻得首个「国产千卡智算集群」落地,支持智源千亿大模型训练

在人工智能引领的时代浪潮中,算力已成为技术进步与创新的核心驱动力。面对当下AI算力需求的飙升、高端AI芯片供应受限的挑战,加之OpenAI带来的技术封锁,唯有坚定不移的发展自主可控的国产技术方案,持续壮大国产智算集群规模,才能一路突破围追堵截,进一步促进国产大模型产业生态繁荣。集群还提供了完善高效的软件栈工具,集成多种主流的深度学习编程框架,通过测试验证,确保了对行业领先人工智能模型的高效支持,做到开箱即用,用户可快速投入模型的开发和部署,加速了其在人工智能领域的布局和发展。方面取得了显著成效。

Ucloud_TShare的博客 1468

List、Map、Set默认初始容量和扩容增量及加载因子

List、Map、Set默认初始容量和扩容增量及加载因子

weixin_44711425的博客 865

Cursor自动生成测试用例

或者把你已有的规则直接复制粘贴到这个文档内(这里我用的是Markdown格式和CSV格式的测试用例生成规则,可以同时生成Markdown和CSV格式的测试用例)。在AI对话框这里,我们可以看到Cursor会逐步来帮我们生成测试用例,先分析识别需求文档,然后生成测试用例,最后会进行质量检查,确保生成的用例符合规范。生成的Markdown格式,可直接导入Xmind,生成思维导图,对应到具体的功能模块看具体的测试点,逻辑会更直观一些。(1)选中规则文档和需求文档:@你的测试用例规则文档@你的需求文档。

十二测试录 2424

Hashtable 和 HashMap

Hashtable 和 HashMap (1)区别,这两个类主要有以下几方面的不同: Hashtable和HashMap都实现了Map接口,但是Hashtable的实现是基于Dictionary抽象类。   在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。  当get()方法返回null值时,即可以表示 HashMap中没有该键,

再见,巴比伦 371

SAP MM模块后续借记、后续贷记、贷方凭证简介

在SAP系统中,后续借记、后续贷记和贷方凭证是处理供应商发票、采购和付款过程中常见的财务交易。

我小时候很黑的博客 3255

【STM32系统及仿真】基于STM32+蓝牙设计的智能窗帘系统__资料编号8

本项目设计并实现了一种基于STM32单片机的智能窗帘系统,集成了光敏传感器、温湿度传感器、蓝牙模块和OLED显示屏,实现了窗帘的自动调节、环境监测和远程控制功能。系统采用STM32F103C8T6作为主控制器,通过光敏传感器检测环境光强,温湿度传感器监测室内环境,蓝牙模块实现与手机APP的通信,用户可以通过APP远程控制窗帘的开合状态。系统在检测到环境光照强度或温度超出设定范围时,可自动调节窗帘的开合,以达到节能和提高舒适度的目的。

嵌入式阿齐Archie 2万+

ArrayList是如何动态扩容的

需要注意的是,由于数组的扩容涉及到数据的复制,因此在频繁进行元素添加或删除操作时,可能会带来一定的性能开销。扩容机制:ArrayList的扩容机制是通过创建一个新的数组,并将原数组中的所有元素复制到新数组中实现的。数组复制:在进行扩容时,ArrayList内部会调用System.arraycopy()方法来将原数组中的元素复制到新数组中。具体来说,在Java的ArrayList中,默认的加载因子是0.75。更新引用:扩容后,ArrayList会将新数组的引用指向内部的数组对象,旧的数组会被垃圾回收。

weixin_39209728的博客 1226

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

浅谈HashMap和HashTable的区别

浅谈HashMap和HashTable的区别 1.两者继承的父类不同 Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。 2.线程安全性不同 HashMap HashTable 方法非同步 方法 同步 Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环...

hw5456的博客 184

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

浅谈HashTable和HashMap

从内部方法来看 HashMap继承AbstractMap类; 而HashTable是继承Dictionary类; 都实现了map,Cloneable(可复制),Serializable(可序列化)三个接口; 从线程安全来看: HashTable是线程安全的,它的每个方法都加入了Synchronize方法,在线程并发环境下,可以直接使用HashTable,不需要为其方法实现同步; HashMap不是线程安全的,在多线程并发环境下可能会产生死锁问题,需要自己增加同步处理; ...

木泽锐 458

浅谈hashmap和hashtable区别?

hashmap和hashtable区别? 相同: HashMap和Hashtable都是用hash算法来决定其元素的存储 异同: 1、继承的父类不同 Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。 2、从线程安全角度: ①Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法...

李公子的博客 1930

浅谈ConcurrentMap的原理逻辑和hashMap及hashTable的对比分析

** 浅谈ConcurrentMap的原理逻辑和hashMap及hashTable的对比分析 ** 本文不想从源码去分析底层实现的原理,都能看懂源码了,也没有必要在这儿听我聊什么蛇皮。创作目的是为了用通俗易懂的语言让初学者了解这条路的大致方向,也就是其主要的逻辑结构原理,让初学者从源码角度学习分析的时候少走弯路。 ##ConcurrentMap的底层结构 ConcurrenMapt的存储是基于数组加链表,这点和hashMap、hashTable的存储原理是一样的。简单来说就是HashEntry[]数组存储

weixin_44284706的博客 372

Java learn浅谈Hashtable和HashMap的区别

首先: HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式 区别1: HashMap可以存放 null Hashtable不能存放null 区别2: HashMap不是线程安全的类 Hashtable是线程安全的类 需要导入: import java.util.HashMap; import java.util.Hashtable; HashMap<String,String> hashMap = new HashMap<String,String>()

yooppa的博客 139

java 哈希 key 为 null_浅谈HashMap、HashTable的key和value是否可为null

结论:HashMap对象的key、value值均可为null。HahTable对象的key、value值均不可为null。且两者的的key值均不能重复,若添加key相同的键值对,后面的value会自动覆盖前面的value,但不会报错。public class Test {public static void main(String[] args) {Map map = new HashMap();...

weixin_42355215的博客 889

Java学习(1):浅谈Hashmap和Hashtable区别

一,Map接口HashMap和HashTable都是实现了Map接口,所以我们得先从Map接口介绍:1,Map接口:从jdk8开始改接口新增了几个方法,而且是有方法体的方法,用default关键字修饰的方法.default关键字default方法是在java8中引入的关键字,也可称为Virtual extension methods——虚拟扩展方法。是指,在接口内部包含了一些默认的方法实现(也就是...

zxf_0601的博客 428

HashMap和HashTable

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

Small_white_528的博客 1235

ConcurrentHashMap、HashMap和HashTable

ConcurrentHashMap、HashMap和HashTable的底层实现、区别以及扩容原理

qw2869534823的博客 1675

hashmap和hashtable的区别

HashMap:适合大多数情况下的键值对存储,允许 null 键和值,线程不安全,但性能较高。Hashtable:内置线程安全,不允许 null 键和值,性能较低,通常被 ConcurrentHashMap 取代。

qq_40914472的博客 1370

Hashmap 和Hashtable 的介绍,使用和区别

1.Hashmap的介绍和使用HashMap是 Java 中一种非常流行的 Map 接口的实现,它存储的内容为键值对(key-value pairs)。使用哈希表作为其内部数据结构,HashMap提供了良好的平均查询时间和较高的插入和删除效率。以下是关于HashMap。

qq_33386162的博客 1168

HashMap 与 HashTable 区别

HashMap和Hashtable线程安全性HashMap是非线程安全的,而Hashtable是线程安全的。性能:由于没有同步开销,HashMap在单线程环境中的性能优于Hashtable。Null键和Null值HashMap允许一个null键和多个null值,而Hashtable不允许null键和null值。继承关系HashMap继承自并实现了Map接口,而Hashtable继承自Dictionary类,属于Java的早期类。迭代器机制HashMap使用Fail-Fast迭代器,而。

Flying_Fish_roe的博客 2229

HashMap 和 Hashtable 有什么区别?

HashMap 和 Hashtable 有什么区别? JDK1.8 主要区别如下: 线程安全性不同。HashMap线程不安全;Hashtable 中的方法是Synchronize的。 key、value是否允许null。HashMap的key和value都是可以是null,key只允许一个null;Hashtable的key和value都不可为null。 迭代器不同。HashMap的I...

ConstXiong 1万+

HashMap和Hashtable区别?

参考: https://blog.csdn.net/luojishan1/article/details/81952147 存储:HashMap 允许key 和 value 为 null,而 Hashtable 不允许。 线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。 推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推...

exodus520的博客 1512
上一篇: 4道JAVA基础题
下一篇: JS继承
chenzhangji0342
博客等级 码龄10年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值