博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中Hashtable和HashMap的区别(转)
阅读量:5049 次
发布时间:2019-06-12

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

1、Hashtable是Dictionary的子类,
1 public class Hashtable
2 extends Dictionary
3 implements Map
, Cloneable, java.io.Serializable
HashMap:
1 public class HashMap
2 extends AbstractMap
3 implements Map
, Cloneable, Serializable

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

2、Hashtable中的方法是同步的(),而HashMap中的方法在默认情况下不是同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:
1 public static 
Map
synchronizedMap(Map
m)
这个方法返回一个同步的Map,也就是说返回的Map是线程安全的。需要注意的是,对返回的map进行迭代时,必须手动在返回的map上进行同步,否则将会导致不确定的行为:
1 Map m = Collections.synchronizedMap(new HashMap());2       ...3   Set s = m.keySet();  // Needn't be in synchronized block4       ...5   synchronized(m) {  // Synchronizing on m, not s!6       Iterator i = s.iterator(); // Must be in synchronized block7       while (i.hasNext())8           foo(i.next());9   }
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,代码是这样的:
1     int hash = key.hashCode();2     int index = (hash & 0x7FFFFFFF) % tab.length;

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

1     public V put(K key, V value) { 2         if (key == null) 3             return putForNullKey(value); 4         int hash = hash(key.hashCode()); 5         int i = indexFor(hash, table.length); 6         for (Entry
e = table[i]; e != null; e = e.next) { 7 Object k; 8 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { 9 V oldValue = e.value;10 e.value = value;11 e.recordAccess(this);12 return oldValue;13 }14 }15 16 modCount++;17 addEntry(hash, key, value, i);18 return null;19 }
1     static int hash(int h) {2         // This function ensures that hashCodes that differ only by3         // constant multiples at each bit position have a bounded4         // number of collisions (approximately 8 at default load factor).5         h ^= (h >>> 20) ^ (h >>> 12);6         return h ^ (h >>> 7) ^ (h >>> 4);7     }
1   static int indexFor(int h, int length) {2         return h & (length-1);3     }

 

转载于:https://www.cnblogs.com/leealways87/archive/2013/04/14/3019831.html

你可能感兴趣的文章
java aes CBC的填充方式发现
查看>>
使用ionic cordova build android --release --prod命令打包报有如下错误及解决方法
查看>>
BZOJ 2338 HNOI2011 数矩形 计算几何
查看>>
关于页面<!DOCTYPE>声明
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
C++标准库vector使用(更新中...)
查看>>
cocos2d-x 2.2.6 之 .xml文件数据读取
查看>>
枚举的使用
查看>>
BZOJ 1531 二进制优化多重背包
查看>>
BZOJ 2324 (有上下界的)费用流
查看>>
python3基础06(随机数的使用)
查看>>
Zookeeper系列(二)特征及应用场景
查看>>
【HTTP】Fiddler(三)- Fiddler命令行和HTTP断点调试
查看>>
Spring Boot使用Druid和监控配置
查看>>
poi 处理空单元格
查看>>
Android 内存泄漏优化总结
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
Spring Cloud微服务笔记(五)Feign
查看>>
C语言键盘按键列表
查看>>
Codeforces Round #374 (Div. 2)
查看>>