JDK源码学习之集合HashMap、Hashtable、WeakHashMap比较

来源:互联网 发布:在笔记本电脑下载软件 编辑:程序博客网 时间:2024/05/21 04:00

先上一张Java 集合框图:
这里写图片描述

HashMap:

public class HashMap<K,V> extends AbstractMap<K,V>    implements Map<K,V>, Cloneable, Serializable 

Hashtable:

public class Hashtable<K,V> extends Dictionary<K,V>    implements Map<K,V>, Cloneable, java.io.Serializable

WeakHashMap:

public class WeakHashMap<K,V> extends AbstractMap<K,V>    implements Map<K,V> 

WeakHashMap是一种改进的HashMap,它对key实验“弱引用”,若是一个key不再被外部所引用,那么该key可以被GC收受接管。

不同:
1. 继承不同:
Hashtable继承自Dictionary
2. 是否允许为null,是否允许重复
HashMap不允许key重复,允许value重复,只允许一个key为null,value可以为任意值,这里有个需要注意的是,但我们用get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。。Hashtable的key和value均不允许为null。
3. 线程安全
HashMap是非synchronized(非线程安全的实现),如果涉及到多个线程,那就不应该考虑使用HashMap。HashMap可以通过下面的语句进行同步: Map map = Collections.synchronizeMap(hashMap) HashTable是synchronized(线程安全实现),这意味着HashTable是线程安全的,多个线程可以共享一个HashTable。但是Java 5提供了ConcurrentHashMap,它比HashTable的扩展性更好、性能更高。ConcurrentHashMap到底和Hashtable有啥不一样,笔者也查阅下相关知识,主要Hashtable的实现方式是锁整个hash表,而ConcurrentHashMap分段式封锁,分层多个节点进行关键部位加锁,避免大锁,允许多个修改操作并发进行。
4.遍历方式的内部实现上不同
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
5.哈希值的使用不同
HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
6.内部实现方式的数组的初始大小和扩容的方式不一样
HashTable中的hash数组初始大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

阅读全文
0 0
原创粉丝点击