HashMap和HashTable的区别
HashMap和HashTable的区别
HashMap的类继承体系、可供外部调用的公开方法:
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三个接口
从公开方法来看,两个类提供的功能一致。都提供键值映射的服务,可以增、删、查、改键值对,可以对建、值、键值对提供遍历视图。支持浅拷贝,支持序列化。
数据结构:都使用哈希表来存储键值对
用法
如果不需要线程安全,那么使用HashMap,如果需要线程安全,那么使用ConcurrentHashMap。HashTable已经被淘汰了,不要在新的代码中再使用它。