搞懂JAVA集合类--HashTable, LinkedHashMap, TreeMap(四)

来源:互联网 发布:xampp ubuntu安装 编辑:程序博客网 时间:2024/06/05 07:55

HashTable, LinkedHashMap, TreeMap相比HashMap不那么常用。

HashTable和HashMap大体差不多,有几点区别:
1. 我们从他们的定义就可以看出他们的不同,HashTable基于Dictionary类,而HashMap是基于AbstractMap。
2. HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。
3. Hashtable的方法是同步的(对操作方法加同步锁),而HashMap的方法不是
4. 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
5. Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

LinkedHashMap是HashMap的一个子类,它保留插入的顺序。保留顺序的机制就是它维护着一个运行于所有条目的双重链接列表,即Entry元素中有after和before两个引用。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。

TreeMap则是另一种实现方式,底层基于红黑树实现
红黑树顾名思义就是节点是红色或者黑色的平衡二叉树,它通过颜色的约束来维持着二叉树的平衡。对于一棵有效的红黑树二叉树而言我们必须增加如下规则:
1、每个节点都只能是红色或者黑色
2、根节点是黑色
3、每个叶节点(NIL节点,空节点)是黑色的。
4、如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
5、从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这棵树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。所以红黑树它是复杂而高效的,其检索效率O(log n)。下图为一颗典型的红黑二叉树。

这里写图片描述
对于红黑二叉树而言它主要包括三大基本操作:左旋、右旋、着色。
这里写图片描述这里写图片描述

底层实现原理就是红黑树算法,比较复杂和难懂。TreeMap没有调优选项,因为该树总处于平衡状态。适用于按自然顺序或自定义顺序遍历键(key),一般在需要按key排序时使用(注意LinkedHashMap是按插入顺序排序,这个是Key的顺序来排序)。Key需要支持Comparable接口或者在创建TreeMap时指定排序器

0 0