阅读 136

Hashmap与Hashtable简介

父类
复制代码

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时,进行扩容

文章分类
后端