HashMap 、 Hashtable 、 treeMap的用处以及他们之间的区别

1.HashMap的用法

HashMap实现了Map接口,继承AbstractMap,它是基于哈希表的 Map 接口的实现(保证键的唯一性),

以key-value的形式存在

HashMap是引用数据类型
通过 new 关键字在 Heap 堆中申请空间
保存其中元素的空间,按照hash码,预设好一个个的空间
这个空间就是 Hash Bucket(哈希桶)
每个桶有自己的Hash编号
一开始有少量的 Hash Bucket,
当程序试图将一个 key-value(Entry) 放入 HashMap 中时,
程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的Bucket位置,
如果该Bucket为空,直接存放入该Bucket;

如果该Bucket不为空,使用 equals 比较两个Entry 的 Key;
    if(true){新 value 将覆盖 Entry 原 value,key 不变}
    if(false){新 Entry 将与 Bucket中原 Entry 形成 Entry 链,
        而且新 Entry 位于 Entry 链的头部}

HashMap 、 Hashtable 、 treeMap的用处以及他们之间的区别_第1张图片

Map集合的遍历:  

Map集合的遍历:
      1、通过内部类Entry进行遍历
      2、通过迭代器进行遍历,先获得Entry的Set集合
      3、通过keySet方法获得键的Set集合,通过遍历键取值
      4、通过map.values()获得所有值,但是不能获得键

2.Hashtable的用法

Hashtable:是Map接口的另外一个实现类,和HashMap用法类似,亦有区别

Hashtable出现于JDK1.0,HashTable基于Dictionary
HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null

Hashtable的方法是同步的,而HashMap的方法不是同步的。

有人建议,涉及多线程使用时候,就使用Hashtable,没有涉及时候就用HashMap.但是在Collections中有一个静态方法

SynchronizedMap(),该方法创建了一个线程安全的Map对象,并且作为一个封装对象返回。所以通过Collections类中的

SynchronizedMap()的方法,我们是可以同步访问潜在的HashMap的

HashMap 、 Hashtable 、 treeMap的用处以及他们之间的区别_第2张图片


3.treeMap用法

TreeMap:基于红黑树(Red-Black tree)的 NavigableMap实现。该映射根据其键的自然顺序进行排序

或者根据创建映射时提供的 Comparator进行排序,具体取决于使用的构造方法。

TreeMap 是一个有序的key-value集合,它是通过红黑树实现的
TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合
TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法,比如返回有序的key集合
TreeMap 实现了Cloneable接口,意味着它能被克隆

TreeMap 实现了Java.io.Serializable接口,意味着它支持序列化

构造方法:

HashMap 、 Hashtable 、 treeMap的用处以及他们之间的区别_第3张图片

TreeMap支持排序:

1、TreeMap默认按键的自然顺序升序进行排序

HashMap 、 Hashtable 、 treeMap的用处以及他们之间的区别_第4张图片

2、TreeMap按降序排列

HashMap 、 Hashtable 、 treeMap的用处以及他们之间的区别_第5张图片

注意:在进行降序排序时,要在构造集合时候传递一个比较器

HashMap  Hashtable  treeMap的原理以及区别

1.这三个都对Map接口进行了实现

2.HashMap是不安全的线程,他允许Key值出现一次null   Value值出现无数次的Null

3.Hashtable是安全的线程,他不仅实现了Map接口也实现了Dictionary接口,他的key值与Value值都不允许出现Null

4.treeMap是可以进行排序的,默认按照键的自然顺序进行升序排序,若要进行降序排序则需要在构造集合时候传递一个比较器




                                                                                                                                                                               







你可能感兴趣的:(JavaSe)