HashMap 和 HashTable 区别
HashMap:
- 由数组+链表组成的,基于哈希表的Map实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的;
- 线程是不安全的,HashMap可以接受为null的键(key)和值(value);
- HashMap重新计算hash值;
HashTable :
- Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射;
- Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null;
- HashTable直接使用对象的hashCode;
相同点:
hashmap和Hashtable都实现了map、Cloneable(可克隆)、Serializable(可序列化)这三个接口;
不同点:
区别 | HashMap | HashTable |
---|---|---|
继承的父类不同 | 继承于AbstractMap | 继承于Dictionary |
key和value对null值的处理不同 | value都可以为null | value都不可以为null |
支持遍历方式不同 | 只支持Iterator(迭代器)遍历,对数组具体某一项对应的链表,从表头开始进行遍历 | 支持Iterator(迭代器)和Enumeration(枚举器)两种方式遍历 |
使用Iterator(迭代器)遍历时,遍历的顺序不同 | “从前向后”的遍历数组 | “从后往前”的遍历数组 |
添加key-value时,hash值算法不同 | 自定义的哈希算法 | 直接采用的key的hashCode() |
容量的初始值和增加方式不同 | 默认的容量大小是16;每次增加容量为“原始容量x2” | 默认容量大小为11;每次增加容量为“原始容量x2+1” |
线程安全性不同 | 线程不安全,但是效率会高于Hashtable | 线程安全,支持多线程 |