CurrentHashMap、HashMap、HashTable的区别

一:这三者最关键的区别就是线程安全的区别

    1. 先说HashMap和HashTable的区别

        最开始的时候 只有HashMap和HashTable,他们最重要的区别就是HashMap不是线程安全的,而HashTable是线程安全的;他们的具体区别如下:

        ①:他们的继承是不同的,HashMap继承的是 AbstractMap,而HashTable继承的是Dictionary 类

        ②:他们存储的键值对有些区别;HashMap的键能有一个为null,而他的值只能有任意多个是null;

由于它的键可以是为空的,所以,所以我们不能用get(key)判断是否有这个键,而应该用containsKey()这个方法来判断是否有这个键;而HashTable中键值对都不能为空;

        ③:他们的扩容方式是不一样的;HashMap默认的初始大小是16,装载因子是0.75,并且扩容的大小一定是2的指数;而HashTable的默认初始大小是11,扩容的方式是 2*old+1;

        ④:哈希值的使用是不同的,HashTable的hash值是直接使用对象中的hashCode方法,而HashMap则是重新计算对象的HashCode;并且用与代替求模;

        ⑤:两个遍历方式的内部实现上不同。

Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

   2.再看CurrentHashMap和HashMap

上面已经知道HashMap是线程不安全的了,后来在jdk1.5的时候就出来了CurrentHashMap来弥补HashMap的线程不安全的特性;CurrentHashMap,是将HashMap分成了很多个片(一般默认是16片),引入了分段锁的概念,然后对每一片加锁,具体可以理解成一把大的Map分解成N个小的HashTable,根据key.hashCode()来决定放到哪一个片上;

    3.三者效率的比较:

        由于安全机制的原因,HashMap的效率比HashTable,CurrentHashMap的效率高;但是由于CurrentHashMap加锁的高效性,HashTable是整个加锁,他的效率比HashTable高; 总的来说 HashMap>CurrentHashMap>HashTable;

具体测试:可以参考https://blog.csdn.net/chaoren2011/article/details/60762313

    补充.为什么String, Interger这样的wrapper类适合作为键?

 String, Interger这样的wrapper类作为HashMap的键是再适合不过了,而且String最为常用。因为String是不可变的,也是final的,而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。不可变性还有其他的优点如线程安全。如果你可以仅仅通过将某个field声明成final就能保证hashCode是不变的,那么请这么做吧。因为获取对象的时候要用到equals()和hashCode()方法,那么键对象正确的重写这两个方法是非常重要的。如果两个不相等的对象返回不同的hashcode的话,那么碰撞的几率就会小些,这样就能提高HashMap的性能。

我们可以使用自定义的对象作为键吗? 这是前一个问题的延伸。当然你可能使用任何对象作为键,只要它遵守了equals()和hashCode()方法的定义规则,并且当对象插入到Map中之后将不会再改变了。如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。
我们可以使用CocurrentHashMap来代替Hashtable吗?这是另外一个很热门的面试题,因为ConcurrentHashMap越来越多人用了。我们知道Hashtable是synchronized的,但是ConcurrentHashMap同步性能更好,因为它仅仅根据同步级别对map的一部分进行上锁。ConcurrentHashMap当然可以代替HashTable,但是HashTable提供更强的线程安全性。看看这篇博客查看Hashtable和ConcurrentHashMap的区别。

                

        

    

猜你喜欢

转载自blog.csdn.net/qq_34144916/article/details/80850116
今日推荐