Hash Map和 Hash Table的区别?

目录

Hash Map:

Hash Table:

区别:

1、继承的父类不同

2.内部实现使用的数组初始化和扩容方式不同

3.底层不同

而HashMap什么时候使用红黑树呢?

4.线程的安全性


Hash Map:

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。

HashMap 是无序的,即不会记录插入的顺序。

HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口

Hash Table:

Hashtable是原始的java.util的一部分, 是一个Dictionary具体的实现 。

然而,Java 2 重构的Hashtable实现了Map接口,因此,Hashtable现在集成到了集合框架中。它和HashMap类很相似,但是它支持同步。

像HashMap一样,Hashtable在哈希表中存储键/值对。当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值。

然后,该键经过哈希处理,所得到的散列码被用作存储在该表中值的索引。

区别:

1、继承的父类不同

Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

2.内部实现使用的数组初始化和扩容方式不同

HashMap原始数组长度为16,而HashTable的原始数组长度为11;Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。HashMap扩容机制是当前数组长度*2,而HashTable扩容机制是当前长度*2-1;当数组容量达到当前数组长度的四分之三时,开始扩容。

Hash Map和 Hash Table的区别?_第1张图片

 

3.底层不同

HashMap:

在JDK 8之前:底层由数组+链表构成。

在JDK 8之后:底层由数组+链表+红黑树构成

Hashtable:

底层由数组+链表组成。

而HashMap什么时候使用红黑树呢?

红黑树是一个趋于自平衡(左右子树深度差的绝对值不超过1)的二叉排序树。而当HashMap链表长度超过8的时候,底层会自动转换成红黑树。

4.线程的安全性

HashMap是线程不安全的类,多线程下会造成并发冲突,但单线程下运行效率较高;HashTable是线程安全的类,很多方法都是用synchronized修饰,但同时因为加锁导致并发效率低下,单线程环境效率也十分低。另外在HashMap结构中,是允许保存null的,Entry.key和Entry.value均可以为null。但是HashTable中是不允许保存null的。

你可能感兴趣的:(散列表,哈希算法,java)