知道HashMap、TreeMap和HashTable区别吗
HashMap、TreeMap和HashTable的区别
Map接口有三个比较重要的实现类,分别是
TreeMapHashMapHashTable
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()方法 |