java中Hashtable和HashMap的区别分析

hpaixzit528

hpaixzit528

2016-02-19 10:36

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享java中Hashtable和HashMap的区别分析吧。

1、Hashtable是Dictionary的子类,
代码如下:

 public class HashtableK,V
     extends DictionaryK,V
     implements MapK,V, Cloneable, java.io.Serializable

HashMap:
代码如下:

public class HashMapK,V
    extends AbstractMapK,V
     implements MapK,V, Cloneable, Serializable

HashMap和Hashtable都是Map接口的一个实现类;

2、Hashtable中的方法是同步的(),而HashMap中的方法在默认情况下不是同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:
代码如下:

public static K,V MapK,V synchronizedMap(MapK,V m)

这个方法返回一个同步的Map,也就是说返回的Map是线程安全的。需要注意的是,对返回的map进行迭代时,必须手动在返回的map上进行同步,否则将会导致不确定的行为:
代码如下:

Map m = Collections.synchronizedMap(new HashMap());
       ...
   Set s = m.keySet();  // Needn't be in synchronized block
       ...
   synchronized(m) {  // Synchronizing on m, not s!
       Iterator i = s.iterator(); // Must be in synchronized block
       while (i.hasNext())
           foo(i.next());
   }

3.在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。Hashtable的键值不能为null,否则:java.lang.NullPointerException 。
4.HashTable使用Enumeration,HashMap使用Iterator。
以上只是表面的不同,它们的实现也有很大的不同。
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
代码如下:

int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;

而HashMap重新计算hash值,而且用与代替求模,比如HashMap的put方法:

代码如下:

public V put(K key, V value) {
         if (key == null)
             return putForNullKey(value);
         int hash = hash(key.hashCode());
         int i = indexFor(hash, table.length);
         for (EntryK,V 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;
     }

代码如下:

static int hash(int h) {
         // This function ensures that hashCodes that differ only by
         // constant multiples at each bit position have a bounded
         // number of collisions (approximately 8 at default load factor).
         h ^= (h 20) ^ (h 12);
         return h ^ (h 7) ^ (h 4);
     }

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

代码如下:

   static int indexFor(int h, int length) {
         return h & (length-1);
     }

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

java中Hashtable和HashMap的区别分析

编程语言 网络编程
java中Hashtable和HashMap的区别分析

Java中对HashMap的深度分析

Java JAVA基础
Java中对HashMap的深度分析

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Java中HashMap和TreeMap的区别深入理解

编程语言 网络编程
Java中HashMap和TreeMap的区别深入理解

java中instanceof和getClass()的区别分析

编程语言 网络编程
java中instanceof和getClass()的区别分析

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

java中ArrayList 、LinkList的区别分析

编程语言 网络编程
java中ArrayList 、LinkList的区别分析

Java overload和override的区别分析

编程语言 网络编程
Java overload和override的区别分析

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

log引起的mysql不能启动的解决方法

log引起的mysql不能启动的解决方法

教你如何在QQ留言板中设置签名档?

教你如何在QQ留言板中设置签名档?
下拉加载更多内容 ↓