父类
复制代码
Hashtable继承自Dictionary接口,Hashmap继承自AbstractMap接口
使用
复制代码
Hashmap与Hashtable在使用方面基本相同,不过对于put()方法,有所差异,Hashmap允许key和value为null,Hashtable若key或value为null会抛出空指针异常。
实现:
复制代码
Hashtable是线程安全的,所有的方法都添加了synchronized关键字(对象锁),Hashmap是线程不安全的,若无并发问题建议使用Hashmap。 Hashtable与Hashmap的实现是采用数组加链表的数据结构,jdk1.8以后对Hashmap链表结构做了调整,当链表长度大于8后,结构调整为红黑树。红黑树相对于平衡二叉树的优势在于,红黑树允许局部的不平衡,写操作时树结构的变换次数相对少,省去了很多调平操作。
虽然Hashtable是线程安全的,但它的实现采用的是悲观锁,在高并发环境下存在死锁问题,建议使用concurrentHashmap。 concurrentHashmap采用分段锁实现,每段都是采用Hashmap实现的,初始容量是16。
扩容
复制代码
Hashmap初始容量为16,Hashtable的初始容量大小为11
HashMap扩容算法为 2n,Hashtable扩容算法为 2n + 1
Hashmap负载因子0.75,当容量达到0.75*n时,进行扩容