• HashMap和Hashtable的区别 源码分析


    一:以前只知道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 而总结理解

     

  • 相关阅读:
    mysql启动错误
    maven环境变量配置
    记一次服务器Tomcat优化经历
    自动定时备份删除脚本
    Tomcat网页加载速度过慢的解决方法
    tomcat运行war包报错,找不到context-root文件
    maven下配置pom.xml
    [LeetCode]题解(python):116-Populating Next Right Pointers in Each Node
    [LeetCode]题解(python):115-Distinct Subsequences
    [LeetCode]题解(python):114-Flatten Binary Tree to Linked List
  • 原文地址:https://www.cnblogs.com/shanheyongmu/p/6102509.html
Copyright © 2020-2023  润新知