Hashtable继承自Dictionary(遗留类,已经不建议在新版本中使用),实现原理和HashMap(1.8之前)一样,但Hashtable是线程安全的。Collections类中提供了一个锁的粒度更小的线程安全内部静态类synchronizedMap
Hashtable定义
Hashtable方法列表
由上方法列表可看出Hashtable实现线程安全是通过synchronized同步方法实现的
synchronizedMap定义与方法
- synchronizedMap实现了Map接口。
- 构造synchronizedMap时将this指针传递给监视器对象mutex,即同步方法块锁住的是synchronizedMap对象自身,并将方法代理在Map集合m的方法上。
- synchronizedMap是Collections的私有静态内部类,可以通过Collecitons.synchronizedMap(Map)方法获取一个synchronizedMap向上转型为Map对象,对外发布。
- synchronizedMap将一个非线程安全的Map集合通过同步方法块锁住对象自身包装为线程安全的Map集合。
Hashtable和HashMap
以下就对比一下Hashtable和HashMap(1.8之前)以及HashMap(1.8)的异同点
主要相同点:
- 都不支持有序操作
- 处理hash冲突都是用的是拉链法
主要不同点:
- 继承结构不同,Hashtable继承自Dictionary,而HashMap继承自AbstractMap。而Dictionary已经被遗弃了。
- Hashtable是线程安全的,方法都为同步方法synchronized,HashMap不是线程安全的。
- HashMap允许key和value都为null,Hashtable不允许key和value为null,会抛出异常。
- Hashtable与HashMap(1.8之前)底层数据结构为数组+链表;HashMap(1.8)为数组+链表+红黑树。
网友评论