HashMap、Hashtable、 TreeMap、WeakhashMap的区别

一、HashMap与HashTable的区别

    首先HashMap(java1.8后HashMap使用数组加链表或数组加红黑树组成)和Hashtable都使用数组加链表的方式进行实现,同时具有数组和链表的特点。

    1、HashMap可以理解为是Hashtable的一个轻量级非线程安全的实现,HashMap允许一个null的key值,而Hashtable不允许

    hashmap中实现的hashtable的方法都是没有加synchronized关键字的,所以性能较高,但是为非线程安全的(此处需要关注之前写的HashMap源码手写实现和ConcurrentHashMap实现原理)。HashMap的线程非安全主要表现在HashMap进行扩容的时候,可能链表会形成环型,所以next()方法永远不能到达而照成CPU的100%(但是不影响接受新的请求,只是会形成多个环形,最后崩溃)。但是Hashtable使用Synchronized关键字保证线程安全的代价是性能特别的低,基本上也不能接受,一般使用ConcurrentHashMap(采用分段锁实现)进行替代。

    2、HashMap将Hashtable的contains方法修改为contaisKey和containsValue方法实现,没有歧义

    3、Hashtable实现枚举,而HashMap使用iterator

    4、两者使用的hash和rehash算法类似,性能差距不大

    5、Hashtable和HashMap的初始化长度和扩容方式不同

    Hashtable的默认初始化数组长度为11,并且扩容的时候为原来的两倍,而HashMap的初始化数组长度为16,并且动态扩容的长度为2的倍数。

    6、Hash值的使用方式不同,Hashtable直接使用了对象的HashCode值


二、TreeMap

    TreeMap使用红黑二叉树方式实现,与上两者完全不同。并且TreeMap实现了SortedMap,所以存取数据会按照可以进行排序(可自定义排序)。所以应该场景为需要按照key进行排序时候,具体后面会单独介绍TreeMap。

三、LindHashMap

    LinkedHashMap是HashMap的一个子类,若需要存放和获取具有相同的顺序则可以使用LinkedHashMap(应用场景)。

四、WeakHashMap

WeakHashMap与HashMap区别在于WeakHashMap的key使用弱引用,若key不再被依赖,则会被垃圾回收器进行回收,而HashMap的key使用强引用,只有没有gcroot指向时才会被回收。


猜你喜欢

转载自blog.csdn.net/it_lihongmin/article/details/80787731