首页 > 代码库 > HashMap和Hashtable的区别
HashMap和Hashtable的区别
1、HashMap的很多方法都不是线程安全的。Hashtable中大部分的方法都是线程安全的。而且HashMap中允许key为null,而Hashtable不允许。
也就是说:大部分(例如Hashtable里面的containsValue方法就不是synchronized)Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
这些都可以从源码中看出来,
HashMap中的put方法:
public V put(K key, V value) {//这个API的设计的时候为什么要有返回值????有点不知道为什么。。。而且按照驼峰命名法,Hashtable的拼写规则应该是HashTable if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = http://www.mamicode.com/e.value;>
Hashtable中的put方法
public synchronized V put(K key, V value) { // Make sure the value is not null if (value =http://www.mamicode.com/= null) {>
2、二者都实现了Map接口。但Hashtable继承与Dictionary这个类,而HashMap继承与AbstractMap这个抽象类(其实AbstractMap也还是实现了Map接口的)。代码如下:
Hashtable的部分源码如下:
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable { /**
HashMap的部分源码如下:
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
AbstractMap部分源码如下:
public abstract class AbstractMap<K,V> implements Map<K,V> { /** * Sole constructor. (For invocation by subclass constructors, typically * implicit.) */ protected AbstractMap() { }
3、有人说,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。(其实,hashtable中也是有containsKey和containsValue这两个方法的,至少我看的版本的源码中是包含这两个方法的。只是hashTable中的ContainsValue内部还是调用他自己的contains()方法
HashMap和Hashtable的区别
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。