博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashMap和Hashtable的区别 源码分析
阅读量:6578 次
发布时间:2019-06-24

本文共 2742 字,大约阅读时间需要 9 分钟。

一:以前只知道HashMap和HashTable区别,死记硬背的记住HashMap 允许key value为空 而Hashtable 不允许为空

HashMap线程是非线程安全的,而Hashtable是安全的。

二.HashMap 和Hashtable 的区别

  我们先看2个类的定义

public class Hashtable      extends Dictionary      implements Map, Cloneable, java.io.Serializable
public class HashMap      extends AbstractMap      implements Map, Cloneable, Serializable

可见Hashtable 继承自 Dictiionary 而 HashMap继承自AbstractMap

Hashtable的put方法如下

 

public synchronized V put(K key, V value) {  //###### 注意这里1    // Make sure the value is not null    if (value == null) { //###### 注意这里 2      throw new NullPointerException();    }    // Makes sure the key is not already in the hashtable.    Entry tab[] = table;    int hash = key.hashCode(); //###### 注意这里 3    int index = (hash & 0x7FFFFFFF) % tab.length;    for (Entry e = tab[index]; e != null; e = e.next) {      if ((e.hash == hash) && e.key.equals(key)) {        V old = e.value;        e.value = value;        return old;      }    }    modCount++;    if (count >= threshold) {      // Rehash the table if the threshold is exceeded      rehash();      tab = table;      index = (hash & 0x7FFFFFFF) % tab.length;    }    // Creates the new entry.    Entry e = tab[index];    tab[index] = new Entry(hash, key, value, e);    count++;    return null;  }

注意1 方法是同步的

注意2 方法不允许value==null
注意3 方法调用了key的hashCode方法,如果key==null,会抛出空指针异常 HashMap的put方法

public V put(K key, V value) { //###### 注意这里 1    if (key == null)  //###### 注意这里 2      return putForNullKey(value);    int hash = hash(key.hashCode());    int i = indexFor(hash, table.length);    for (Entry e = table[i]; e != null; e = e.next) {      Object k;      if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {        V oldValue = e.value;        e.value = value;        e.recordAccess(this);        return oldValue;      }    }    modCount++;    addEntry(hash, key, value, i);  //###### 注意这里     return null;  }

注意1 方法是非同步的

注意2 方法允许key==null
注意3 方法并没有对value进行任何调用,所以允许为null

补充: 

  Hashtable 有一个 contains方法,容易引起误会,所以在HashMap里面已经去掉了
当然,2个类都用containsKey和containsValue方法。

 

                           HashMap                Hashtable

父类                   AbstractMap          Dictionary

是否同步              否                            是

k,v可否null        是                            否

 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,

  主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

 

  HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

 

 

  HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 

 

 

  Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

 

 

  最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap)。 

 

  Hashtable和HashMap采用的hash/rehash都大概一样,所以性能不会有很大的差异。

 总结

     HashMap中键值 允许为空 并且是非同步

     Hashtable中键值 不允许为空 是同步

     继承不同,但都实现了Map接口

阅读http://www.cnblogs.com/hcl22/p/6095927.html 而总结理解

 

你可能感兴趣的文章
法瑞意游记+攻略 二(巴黎,十二月二十七)未完
查看>>
算法笔记之 并查集入门 POJ 1611
查看>>
sql语句实例析解
查看>>
ExtJs 起始日期 结束日期 验证
查看>>
Getting over the dangers of rm command in Linux---reference
查看>>
25个有用的和方便的 WordPress 速查手册
查看>>
我的Android开发相关文�
查看>>
jquery和css3实现的很酷的菜单导航
查看>>
Nginx.conf简介
查看>>
Cucumber 入门一
查看>>
Openfire开发配置,Openfire源码配置,OpenFire二次开发配置
查看>>
Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同
查看>>
iOS7隐藏状态栏 status Bar
查看>>
Android中View绘制流程以及invalidate()等相关方法分析
查看>>
安装ESXI 5.5卡在LSI_MR3.V00解决方案
查看>>
在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)
查看>>
centos 7 卸载 mariadb 的正确命令
查看>>
NSString 的常用操作
查看>>
poj 1274The Perfect Stall
查看>>
[Jmeter系列]Jmeter源码编译步骤(转)
查看>>