zoukankan      html  css  js  c++  java
  • 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方法。

  • 相关阅读:
    csuoj 1111: 三家人
    csu oj 1339: 最后一滴血
    csuoj 1337: 搞笑版费马大定理
    csuoj 1334: 好老师
    csu oj 1330 字符识别?
    C++动态内存分配
    变量内存分配
    codevs 2235 机票打折
    contesthunter CH Round #64
    面试分享:一年经验初探阿里巴巴前端社招
  • 原文地址:https://www.cnblogs.com/liugang/p/1685098.html
Copyright © 2011-2022 走看看