HashMap与Hashtable的区别

HashMap、HashSet、Hashtable的区别 突然发现整理了很多笔记,应该放这里做备用 Hashtable和HashMap 主要区别:线程安全性,同步(synchronization),以及速度。 HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null。Hashtable是线程安全的,多个线程可以共享一个Hashtable。 HashMap的同步问题可通过Collect... 阅读详情

Hashtable的应用非常广泛,HashMap是新框架中用来代替Hashtable的类,也就是说建议使用HashMap,不要使用Hashtable。可能你觉得Hashtable很好用,为什么不用呢?这里简单分析他们的区别。

1.Hashtable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized 关键字,而HashMap的源代码中则连 synchronized 的影子都没有,当然,注释除外。

2.Hashtable不允许 null 值(key 和 value 都不可以),HashMap允许 null 值(key和value都可以)。

先看个Hashtable正常输出的示例:

Hashtable table = new Hashtable();
table.put("a-key", "a-value");
table.put("b-key", "b-value");
table.put("c-key", "c-value");

输出如下:

a-key - a-value
c-key - c-value
b-key - b-value

再看个Hashtable拒绝null的示例:

table.put(null, "a-value");

运行之后异常如下:

Exception in thread "main" java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:399)
at com.darkmi.sandbox.HashtableTest.main(HashtableTest.java:20)

HashMap示例:

HashMap map = new HashMap();
map.put(null, "a-value");
map.put("b-key", null);
map.put("c-key", null);

运行之后,输出如下:

b-key - null
null - a-value
c-key - null

PS:从上面的示例我们倒是可以发现Hashtable与HashMap相同的一点:无序存放。

3.两者的遍历方式大同小异,Hashtable仅仅比HashMap多一个elements方法。

Enumeration em = table.elements();
while (em.hasMoreElements()) {
String obj = (String) em.nextElement();
System.out.println(obj);
}

Hashtable 和 HashMap 都能通过values()方法返回一个 Collection ,然后进行遍历处理:

Collection coll = map.values();
Iterator it = coll.iterator();
while (it.hasNext()) {
String obj = (String) it.next();
System.out.println(obj);
}

两者也都可以通过 entrySet() 方法返回一个 Set , 然后进行遍历处理:

Set set = table.entrySet();
Iterator it = set.iterator();
while (it.hasNext()) {
Entry entry = (Entry) it.next();
System.out.println(entry.getKey() + " - " + entry.getValue());

}

4.另外,尽管无关痛痒,但细心的你也许会发现,Hashtable这个类的命名居然不遵循Java API 中通用的骆驼式命名法。HashMap、ArrayList等等集合类都是第二个单词首字母大写,唯有Hashtable的第二个单词是首字母小写的,独一无二,仅此一家,呵呵。

以下这两点是从内部实现机制上来进行比较,了解即可:

5.哈希值的使用不同,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);
}

6.Hashtable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

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

相关推荐

ArcGIS基于DEM提取微流域单元(附练习数据下载)

流域作为一个相对独立的地理单元,与行政区的划分有着本质上的区别。流域的划分更注重自然因素,流域作为一个综合的自然整体,在其内部形成了一个天然的物质与能量流动的场所,并通过水流的作用,与周围的区域进行物质和能量的交换。流域的精确划分作为一个研究的基础工作,那么接下来给大家说一下利用DEM提取小流域的案例教程——以贵州省遵义市正安县为例。 1 数据获取 地理空间数据云(http://www.gscloud.cn/),数据分辨率为30m。也可直接点击这篇直接下载→全国30m90mDEM下载。 若想要获得更高精度.

qq_43173805的博客 4827

[转载]hashmap hashtable 的区别

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

weixin_30475039的博客 230

比亚迪 10C 闪充技术全解析:超高速离子通道与双电子流设计如何颠覆电动车补能格局?

性能碾压主流方案参数宁德时代6C比亚迪10C优势幅度最大电流700A1000A+43%内阻降幅30%50%+67%5分钟补能240公里400公里+67%

百态·数智思维 | 聚焦大数据、量化与未来AI 1100

HashTable与HashMap

HashTable与HashMap的共同点和不同点从父类和接口上来看相同点不同点从使用上相同点不同点底层数据结构源码比较表格 从父类和接口上来看 相同点 1)Map<K,V> 存储双值;(本身继承) 以key—>value的形式存储数据,并且key是不重复的,元素的存储位置由key决定,也就是可以通过key去寻找key-value的位置,从而得到value的值,适合做查找工作。 2)Cloneable,可以使用clone方法;(本身继承) 3)Serializable,可以被序列化;(本身

weixin_45808562的博客 375

DINOv3实战指南:如何利用零样本视觉模型革新工业质检

本文详细介绍了如何利用DINOv3零样本视觉模型革新工业质检流程。通过无需标注数据的自监督学习技术,DINOv3能快速部署高精度检测系统,显著降低成本和提升效率。文章涵盖模型选型、数据准备、实时检测优化及典型行业解决方案,为工业质检提供革命性AI实践指南。

ansible6ops的博客 118

英飞凌TC377的Flash管理、UCB配置与HSM安全机制解析

本文深入解析了英飞凌TC377微控制器的Flash存储结构、UCB配置机制与HSM安全模块。详细阐述了带Cache与不带Cache的PFlash地址访问差异、利用SOTA与AB Swap实现无感OTA更新的原理,以及如何通过UCB安全配置启动流程与写保护。重点剖析了HSM硬件安全模块在密钥管理、安全启动与安全OTA中的核心作用,为开发高可靠性嵌入式系统提供实战指南。

weixin_29170327的博客 515

Java中的HashMap和Hashtable

[size=large][b]转载于:http://www.cnblogs.com/devinzhang/archive/2012/01/13/2321481.html。 并做了些修改。[/b] 1. HashMap 1) hashmap的数据结构 Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示: [img]http://dl...

iteye_7831的博客 221

海康工业相机BayerRG8转BGR8实战:手把手教你用OpenCV实现高效图像转换

本文详细解析了海康工业相机BayerRG8格式到BGR8格式的高效转换实战。针对工业视觉项目中高帧率、大分辨率场景下的性能瓶颈,文章对比了海康SDK原生方案与OpenCV多种转换方法的优劣,并提供了从基础实现到高级优化(如多线程流水线、内存管理、SIMD指令集应用)的完整代码示例与性能调优策略,帮助开发者构建稳定、高效的图像处理系统。

weixin_29237635的博客 518

HashMap与HashTable

HashMap HashMap底层是一个Entry[]数组;当发生hash冲突的时候,hashMap是采用链表的方式来解决;在对应的数组位置存放链表的头节点;新加入的节点会从头节点加入;超过阀值(默认8),单链表就会转为红黑树,提高检索速度; HashMap扩容的条件是:当size大于threshold时,对HashMap进行扩容(threshold=容量*加载因子)默认加载因子为0.75...

qq_37876078的博客 215

GoDaddy域名解析 到 阿里云域名DNS

一:登录GODaddy,点击“个人中心”,然后点击“管理域名” 二:域名解析 第一种:直接解析到对应的服务器 添加一个,类型默认A,主机填写二级域名前缀(image.主域名),指向填写目标服务器ip即可(注意目标服务器80端口是否开放) 第二种:将主域名dns转到阿里云域名下 三:若要修给为阿里云解析服务器,要做以下修改,点击“更改” 点击更改后出现如下页面,此时需要到阿里云官网云解析DNS下添加域名解析 四:阿里云添加域名解析...

xiaolinzi176的博客 6695

TIBCO Jaspersoft Studio报表开发 使用教程-进阶版

本文学习内容容器定制二级目录三级目录 容器定制 二级目录 三级目录

吉哲的博客 7515

从hash表到hashMap的理解

hash表的理解 首先我们先明白什么是 hash 比如一个map集合中取出所有的key集合,将这个集合中每一个元素通过一定的算法(f),将这个不确定长度的集合的每个元素,映射到一个固定长度的数组当中.(通常key集合的长度远远大于数组的长度) 将key集合中的元素k----->通过f函数算法------>得到在数组中的位置,这给位置我们叫做f(k) ...

Mr_Li的博客 271

R语言数据可视化:绘制世界地图的两种方案

本文介绍了两种使用R语言绘制世界地图的方案:包含边界边框和不包含边界边框。无论您选择哪种方案,使用ggplot2包和相关的地理数据包,我们可以轻松地绘制出漂亮的世界地图。R语言提供了丰富的包和函数,使我们能够轻松地绘制世界地图,并根据需求添加边界边框。在本文中,我将介绍两种绘制世界地图的方案:一种包含边界边框,一种不包含边界边框。在上述代码中,我们使用了与方案一相同的数据准备和地图绘制步骤,但省略了添加边界边框的代码。函数的调用,我们可以绘制不包含边界边框的世界地图。方案二:绘制不包含边界边框的世界地图。

CodeMaven的博客 2222

HashMap 与HashTable的区别

HashMap 与HashTable的区别 HashMap与Hashtable的区别是面试中经常遇到的一个问题。这个问题看似简单,但如果深究进去,也能了解到不少知识。本文对两者从来源,特性,算法等多个方面进行对比总结。力争多角度,全方位的展示二者的不同,做到此问题的终结版。 1 作者 Hashtable的作者: HashMap的作者: Hash Map的作者比Hashta...

wangxing233的博客 21万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

hashmap和hashtable的区别

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

qq_40914472的博客 1370

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

HashMap与HashTable的区别

HashMap和Hashtable各有优缺点,选择使用哪一个取决于具体的需求。在单线程环境中,如果追求高性能和低内存使用,HashMap是更好的选择。而在多线程环境中,如果需要线程安全的数据结构,则应选择Hashtable。开发者应根据实际应用场景和需求来选择合适的数据结构。在Java编程中,HashMap和Hashtable都是用于存储键值对的数据结构,但它们在多个方面存在显著的差异。本文将详细探讨HashMap与Hashtable的区别,以便开发者在实际应用中能够做出明智的选择。

qq_65860758的博客 914

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

HashMap和HashTable的区别

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

sinat_26552841的博客 1万+

HashMap 和 Hashtable 的区别

一、继承的父类不同 HashMap继承自AbstractMap类,而Hashtable继承自Dictionary类。尽管它们实现的接口都是Map接口,但由于继承的父类不同,导致它们在一些行为和方法上存在差异。 二、线程安全性不同 HashMap是非同步的,这意味着它不是线程安全的。在多个线程同时访问HashMap时,如果没有适当的同步机制,可能会导致数据不一致的问题。 Hashtable是线程安全的,它的方法被synchronized修饰,因此在多线程环境下可以直接使用Hashtable而无需额外的同

2301_80140022的博客 1508

HashMap、Hashtable、ConcurrentHashMap的区别

HashMap、Hashtable、ConcurrentHashMap是日常开发中使用频率较高的数据结构,它们都是以key-value的形式来存储数据,且都实现了Map接口,日常开发中很多人对其三者之间的区别并没有十分清晰的概念。本文将剖析部分源码,以及从线程安全性、速度等方面来分析三者之间的区别。首先讲下三者的一些区别:1.HashMap与Hashtable基本上等价,区别在于Hashtable的大部分方法都是被synchronized修饰,并且键值都不能为null(HashMap则可以);...

qq_33479841的博客 6063

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万+

HashTable HashMap ConcurrentHashMap 的介绍以及区别

本文主要是介绍HashMap HashTable 以及ConcurrentHashMap三者,以及这三者之间的区别

qq_54469537的博客 1816

HashTable与HashMap的区别

HashTable与HashMap的区别 1) HashMap不是线程安全的 HashMap是Map接口的子接口,是将键映射到值的对象。 其中键和值都是对象,并且不能包含重复键(如果键重复,则会将值覆盖),但可以包含重复值。 HashMap允许null key和null value 说明: Java代码: @Test public void testHashMap() { ...

LiGuogang 280

HashMap和Hashtable的区别

1、继承关系 HashMap继承于Map接口的一个实现类AbstracMap public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { public abstract class AbstractMap<K...

蔡茂的博客 894
上一篇: JAVA内存泄漏问题
下一篇: Servlet生命周期
joehope
博客等级 码龄16年 2粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值