HashMap和HashTable的区别

HashMap和HashTable的区别

HashMap的类继承体系、可供外部调用的公开方法:

HashMap

HashTable的类继承体系、可供外部调用的公开方法:

HashTable

接口定义

Dictionary:该抽象类定义了key-value的集合,定义每个key与value都是一个对象,不允许null值作为key与value,值得注意的是这个类已经过时了,新的实现都需要实现Map接口而不是该抽象类

Map定义将键值映射到值的对象,Map规定不能包含重复的键值,每个键最多可以映射一个值,这个接口是用来替换Dictionary类

Cloneable实现了该接口的类可以显式的调用Object.clone()方法,合法的对该类实例进行字段复制,如果没有实现Cloneable接口的实例上调用Obejct.clone()方法,会抛出CloneNotSupportException异常。正常情况下,实现了Cloneable接口的类会以公共方法重写Object.clone()

Serializable:实现了该接口标示了类可以被序列化和反序列化

HashMap

  • 继承自抽象类AbstractMap

  • 支持null键和null值(对null做了特殊处理,遇到 key 为 null 的时候,调用 putForNullKey 方法进行处理, value 为null时不处理)

  • 容量:默认的初始化大小为16,之后每次扩充为原来的2倍

  • 线程不安全的

HashTable

  • 继承自抽象类Dictionary(已废弃)

  • key 和 value 都不允许为 null,遇到null时,会抛出NullPointerException异常

  • 容量:默认的初始大小为11,之后每次扩充为原来的2n+1

  • 线程安全的(公开的方法使用了synchronized描述符,遍历视图使用Collections.synchronizedXXX进行了同步包装)

共同点

  • 都实现了Map、Cloneable、Serializable三个接口

  • 从公开方法来看,两个类提供的功能一致。都提供键值映射的服务,可以增、删、查、改键值对,可以对建、值、键值对提供遍历视图。支持浅拷贝,支持序列化。

  • 数据结构:都使用哈希表来存储键值对

    HashMapDataStructure

用法

如果不需要线程安全,那么使用HashMap,如果需要线程安全,那么使用ConcurrentHashMap。HashTable已经被淘汰了,不要在新的代码中再使用它。


HashMap和HashTable的区别
https://shikai.info/archives/differences-between-hashmap-and-hashtable
作者
石 凯
发布于
2023年08月02日
许可协议