java中hashmap和hashtable的区别

Java中HashMap和Hashtable的区别 HashMap的迭代器设计为fail-fast是为了快速检测到并发修改,避免在迭代过程中出现数据不一致的问题。当检测到并发修改时,迭代器会立即抛出,提醒开发者需要处理并发问题。 阅读详情

1、  继承和实现区别

Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。

2、  线程安全不同

HashTable的方法是同步的,HashMap是未同步,所以在多线程场合要手动同步HashMap。

3、  对null的处理不同

HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。即HashTable 不允许null值其实在编译期不会有任何的不一样,会照样执行,只是在运行期的时候Hashtable中设置的话回出现空指针异常。HashMap允许 null值是指可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。

4、  方法不同

HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
5、HashTable使用Enumeration,HashMap使用Iterator。

6、HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
7、哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = 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);
}

 

区别

Hashtable

Hashmap

继承、实现

Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable,Serializable

HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable,Serializable

 

线程同步

已经同步过的可以安全使用

未同步的,可以使用Colletcions进行同步Map Collections.synchronizedMap(Map m)

对null的处理

 

Hashtable table = new Hashtable();

table.put(null, "Null");

table.put("Null", null);

table.contains(null);

table.containsKey(null);

table.containsValue(null);

后面的5句话在编译的时候不会有异常,可在运行的时候会报空指针异常具体原因可以查看源代码

public synchronized V put(K key, V value) {

     // Make sure the value is not null

  if (value == null) {

         throw new NullPointerException();

}

HashMap map = new HashMap();

map.put(null, "Null");

map.put("Null", null);

map.containsKey(null);

map.containsValue(null);

以上这5条语句无论在编译期,还是在运行期都是没有错误的.

在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。

增长率

   protected void rehash() {

      int oldCapacity = table.length;

      Entry[] oldMap = table;

      int newCapacity = oldCapacity * 2 + 1;

      Entry[] newMap = new Entry[newCapacity];

      modCount++;

      threshold = (int)(newCapacity * loadFactor);

      table = newMap;

      for (int i = oldCapacity ; i-- > 0 ;) {

          for (Entry<K,V> old = oldMap[i] ; old != null ; ) {

           Entry<K,V> e = old;

           old = old.next;

           int index = (e.hash & 0x7FFFFFFF) % newCapacity;

           e.next = newMap[index];

           newMap[index] = e;

          }

      }

    }

 

void addEntry(int hash, K key, V value, int bucketIndex) {

      Entry<K,V> e = table[bucketIndex];

        table[bucketIndex] = new Entry<K,V>(hash, key, value, e);

        if (size++ >= threshold)

            resize(2 * table.length);

    }

 

哈希值的使用

HashTable直接使用对象的hashCode,代码是这样的:

public synchronized boolean containsKey(Object key) {

      Entry tab[] = table;

      int hash = key.hashCode();

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

      for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {

          if ((e.hash == hash) && e.key.equals(key)) {

           return true;

          }

      }

      return false;

    }

HashMap重新计算hash值,而且用与代替求模

      public boolean containsKey(Object key) {

              Object k = maskNull(key);

              int hash = hash(k.hashCode());

              int i = indexFor(hash, table.length);

              Entry e = table[i];

              while (e != null) {

                  if (e.hash == hash && eq(k, e.key))

                      return true;

                  e = e.next;

              }

              return false;

          }

 

Java HashMap 和 Hashtable 的区别是什么? HashMap 与 Hashtable 的深度对比 HashMap 和 Hashtable 都是 Java 中用于存储键值对的集合类,但它们在设计理念、线程安全性和性能特性上有显著差异。 阅读详情

相关推荐

立创EDA手动拼板实战:当自带功能不够用,如何用‘复制粘贴’搞定异形拼版与特殊布局

本文详细介绍了立创EDA手动拼板技术在异形拼版与特殊布局中的应用实战。通过CTRL+SHIFT+V等核心操作技巧,解决混合尺寸拼板、特殊间距需求等复杂场景,提升PCB设计效率与灵活性,特别适合需要高精度控制的射频电路和医疗设备项目。

weixin_31967485的博客 386

Java中HashMap和HashTable的区别

1、两者父类不同 HashMap是继承自AbstractMap类,而Hashtable是继承自Dictionary类。不过它们都实现了同时实现 了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。 2、对外提供的接口不同 Hashtable比HashMap多提供了elments() 和contains() 两个方法。 elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的 value的枚举。

m0_51684972的博客 3756

【PyTorch版本兼容性指南】如何在不同版本中正确使用torch.nn.attention

本文详细解析了PyTorch版本兼容性问题,特别是torch.nn.attention模块在不同版本中的使用差异。针对常见的ModuleNotFoundError错误,提供了三种实用解决方案:升级PyTorch版本、使用自定义实现和源码移植方案,并分享了最佳实践建议,帮助开发者有效避免兼容性问题。

weixin_29084231的博客 472

java中HashMap和HashTable的区别

在上面的示例中,我们可以看到HashMap允许键和值为null,而HashTable不允许。如果尝试在HashTable中使用null作为键或值,会抛出NullPointerException。在Java中,HashMap和HashTable都是用于存储键值对的数据结构,但它们之间存在一些区别。

牛肉胡辣汤 433

RAG开源框架深度评测:从RAGFlow到Dify的实战选型指南

本文深度评测了主流RAG开源框架(RAGFlow、Dify、WeKnora)的核心能力与实战表现,提供企业级选型指南。重点对比了文档解析、检索性能和生产部署等关键指标,揭示RAGFlow在复杂文档处理、Dify在低代码开发、WeKnora在腾讯生态集成的差异化优势,并给出技术选型决策树与成本优化方案。

weixin_29294597的博客 826

Android存储方案对比(SharedPreferences 、 MMKV 、 DataStore)

简介:本文介绍了Android开发中常用的键值对存储方案,包括SharedPreferences、MMKV和DataStore,并且对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。

LiuYong_01的博客 1786

HashMap和HashTable的区别

HashMap是继承自AbstractMap类,而Hashtable是继承自Dictionary类。不过它们都实现了同时 实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。

sinat_26552841的博客 1万+

cartographer从入门到精通(一):cartographer介绍

Cartographer的架构图我们可以看到白色框出来的三个区域,分别是Input Sensor Data(数据输入模块)Local SLAM(局部SLAM模块)Global SLAM (background thread)(全局SLAM模块)下面我们分别介绍一下这几个模块。

weixin_68094467的博客 1052

HashMap和Hashtable的区别

HashMap使用的是自定义的算法,当我们进入put方法查看时,看见put方法中return了一个叫putVal的方法,刚方法前面把这个key传进去又调用了一个叫hash的方法,这个是它自己的方法,点进去之后会发现,他又将这个key获取了一个hashcode,然后把它右移了16位,跟当前的hashcode做了一个异或。进入put方法- 进入hash方法而Hashtable进入put方法后可以看见,它只是调用了当前key自己的hashcode方法。

m0_56383107的博客 2万+

【SigmaStar SSC335系列】空片用Flash_Tool烧写

简介 本文主要讲新拿到的PCBA,板上spi nand flash还是空的,如何在这种情况下烧录固件,这里讲解用官方Flash_Tool烧写的方式。 但只讲一些注意的地方和坑,其它的官方文档里说的比较清楚,不多说。 准备 Flash_Tool烧写软件 编译打包好烧写镜像 串口烧录小板 ----- 这个是个坑,在官方文档里并没有提及,刚开始用的平时调试的USB转串口,怎么都没反应,一度不知烧写软件不对还是硬件有问题,最后通过厂家技术支持才得知,除了专门的Flash_Tool外,还要专门的串口烧录器

老K 4698

芒果YOLO11改进137:卷积AKConv篇,即插即用,具有任意采样形状和任意数量的参数的卷积内核

卷积AKConv篇,即插即用,具有任意采样形状和任意数量的参数的卷积内核

包括YOLOv5、YOLOv7、YOLOv8等模型改进 297

HashMap和HashTable区别

Hashtable的查找、插入和删除操作平均时间复杂度为O(1),但是在极端情况下,因为哈希冲突的原因,可能会退化到O(n)。HashMap中可以存储null值和null键,但是要注意,当使用null作为键时,由于无法调用null的hashCode()方法,因此只能将其放在哈希表的第一个位置,它们是无序的。另外,由于HashMap采用链表和红黑树的数据结构,可以更好地处理哈希冲突,因此HashMap的查找、插入和删除操作都是常数时间O(1)。线程安全性指在多线程环境下,数据的并发访问是否会产生问题。

weixin_58724261的博客 1万+

Python实现PDB文件预处理

蛋白质结构研究依赖PDB文件存储的三维结构数据,但原始文件常含无关的水分子、离子和非标准残基等干扰信息。本文介绍了一个基于BioPython的Python预处理脚本,可自动清理PDB文件,主要功能包括:1)移除短于阈值的蛋白质链;2)过滤非标准氨基酸;3)可选保留水分子和金属离子。该脚本逻辑清晰,支持批量处理,能显著提升结构比对、分子对接等分析前的数据准备效率,为后续生物信息学研究提供更纯净的结构数据基础。

Protein Designer的博客 568

Java中HashMap和Hashtable有什么区别

原文链接:https://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html Java中HashMap与Hashtable的区别 HashMap和Hashtable都实现了Map接口,但是在决定在Java中是否使用HashMap或Hashtable之前,它们之间有一些重要的区别,这一点很重要。其中一些是线...

Mr.Xie的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java集合框架中HashMap和Hashtable的区别是什么?

Java集合框架(Java Collections Framework, JCF)是一组相互关联的接口和类,旨在提供一种标准的方式来存储和操作数据。集合框架中最常用的接口包括CollectionSetListMap等。Map接口定义了键值对映射的标准,而HashMap和Hashtable则是Map的具体实现。HashMap和Hashtable虽然都是Map接口的实现,但它们之间存在着明显的区别。HashMap提供了更好的性能,并且支持null键和null值,适用于大多数单线程场景。Hashtable。

你好,欢迎来到我的个人技术博客!我是一个还有头发的程序猿,一名热衷于探索编程奥秘的程序员。在这个充满无限可能的数字时代,我致力于通过代码编织梦想,解决问题,不断追求技术的极致。 自从踏上编程之旅以来,我涉足了多个领域,包括但不限于Web开发、移动应用开发 1461

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java中HashTable和HashMap的区别

关于Java中HashTable和HashMap的区别: 1、继承: HashTable继承自Dirctionary,HashMap继承自AbstractMap,二者均实现了Map接口; 2、线程安全性: HashTable的方法是同步的,即是线程安全的。HaspMap的方法不是同步的,不是线程安全的的。在多线程并发的情况下,我们可以直接使用HashTable,如果 要使用HashMap

Tiger_8023的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java中HashMap与HashTable的联系与区别

Java中HashMap与HashTable的联系与区别 HashMap与HashTable的联系 都实现了Map接口,保存了Key-Value(键值对) 两者的数据结构类似。HashMap和HashTable都是由数组元素为链表头节点的数组组成。 HashMap与Hash Table的区别 两者继承的父类不同; HashMap继承AbstractMap类,而HashTable继承Dic...

龙套的博客 3730

Java 中的 HashMap 和 Hashtable 有什么区别?

在实际开发中,除非维护遗留代码,否则应优先选择。,以获得更好的性能和扩展性。

2302_81141145的博客 678

Java中HashSet、HashMap和HashTable的区别

Java中HashSet、HashMap和HashTable的区别

Sueko的博客 1917

Java:HashMap和Hashtable的区别

总之,如果你无需关心同步(synchronized)问题,我会建议用。哪一个对于多线程应用程序更好?反之,你可以考虑使用。

2402_83194310的博客 100

Java中的HashMap和Hashtable有什么区别?

在Java中,枚举类型是一种特殊的类,它用于表示一组固定的值。这些值可以是整数、字符串或其他枚举类型。枚举类型可以用于创建一组固定的常量,并在程序中使用它们。定义枚举类型:使用关键字enum来定义枚举类型。例如,以下代码定义了一个表示星期的枚举类型:在这个例子中,Weekday是一个枚举类型,它包含了七个常量:星期一、星期二、星期三、星期四、星期五、星期六和星期日。使用枚举类型:在程序中可以使用枚举类型的常量。

WangYaolove1314的博客 1005

java中HashMap和Hashtable的区别

Java 必知必会 第 13 篇 differences between hashmap and hashtable HashMap和Hashtable的区别 问题 在Java中HashMap和Hashtable的区别? 哪一个对于多线程应用程序更好? 回答 Hashtable是同步的,加了synchronized锁,而HashMap不是。没有加synchronized锁的对象,性能通常比加了s...

十年互联网开发老兵,陪你一起学技术 197

Java集合中HashMap、TreeMap和HashTable区别是什么?

一、说到三者的区别首先要说一下集合和数组的区别是什么: 1.长度上的区别:集合的长度是可变的,而数组的长度是不可变; 2.内容上的区别:数组可以是基本数据类型的数据,也可以是引用数据类型的数据;而集合只能是引用数据类型数据; 3.元素内容上的区别:数组只能存储同一种数据类型;而集合可以存储不同数据类型(其实集合一般情况下也是存储同一种数据类型); 二、Java集合常见的接口和实现类有哪...

冰冻非一日之寒 4041

Java HashMap、Hashtable、HashSet、TreeMap 之间的区别

HashSet 底层是基于 HashMap 实现的,除了 clone()、writeObject()、readObject()是 HashSet 自己实现的,其他方法都是直接调用 HashMap 中的方法。这些方法都是基于红黑树数据结构的属性实现的,红黑树保持平衡状态,从而保证了搜索操作的时间复杂度为 O(log n),这让 TreeMap 成为了处理有序集合搜索问题的强大工具。综上所述,相比于 HashMap,TreeMap 主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索能力。

好记性不如烂笔头 866

Java基础: HashMap和HashTable的区别

这篇文章主要介绍了HashMap和HashTable详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。放假在家里休息,闲来无事,想巩固巩固自己的基础知识。Java基础这个我会一直更新的,希望大家关注 收藏 点赞。

weixin_42188778的博客 1466
上一篇: T-SQL语句添加、删除约束语法
下一篇: Java中ArrayList和Vector的区别
cg_program
博客等级 码龄19年 245粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值