HashMap、TreeMap和HashTable的区别
Map
接口有三个比较重要的实现类
,分别是
TreeMap
HashMap
HashTable
TreeMap
有序的
线程不安全
TreeMap
是SortedMap
的实现类
- 基于
红黑树
每个key-value对
作为红黑树的一个节点
- 没有调优选项,因为该树
总是
处于平衡状态
存储key-value对
时,需要根据key
对节点
进行排序
(两种排序方式)自然排序
:TreeMap
的所有key
必须实现Comparable接口
,而且所有的key
应该是同一个类的对象
,否则会抛出ClassCastException
定制排序
:创建TreeMap
时,传入一个Comparator对象
,该对象负责对TreeMap
中的所有key
进行排序
HashMap & HashTable
不同点
HashMap | HashTable | 说明 |
---|---|---|
无序的 | 无序的 | |
HashMap 继承了AbstractMap 抽象类 | HashTable 继承了Dictionary 抽象类 | 父类不同 |
HashMap 允许一个空键 (其他的空键会覆盖第一个空键)和 任意数量 的NULL 值 | HashTable 不允许 NULL 值(包括键或值) | <key, value> 的NULL 区别 |
方法是异步 的(即,线程不安全 ,效率较高) | 方法是同步的 (即,线程安全的 ,效率较低) | HashTable 和HashMap 最主要的区别。如果对同步性没有要求,建议使用 HashMap 。 看 HashTable 的源码,除构造函数 外,HashTable 的所有 public 方法声明中都有 synchronized 关键字,而HashMap 的源码中则没有。 |
HashMap 去掉了HashTable 的contains() 方法,但是加上了containsValue() 和containsKey() 方法 | ||
HashMap 中hash数组 的默认大小是16 ,而且一定是2的指数 | HashTable 中hash数组 默认大小是11 ,增加的方式是 old * 2 + 1 |
相同点
HashMap & HashTable |
---|
HashMap 和HashTable 的底层实现都是数组 + 链表 实现 |
HashMap 和HashTable 的数据元素是无序的 |
为了成功地在HashMap 和HashTable 中存储和获取对象,用作key 的对象必须实现hashCode() 方法和equals() 方法 |
全部评论
(3) 回帖