转HashMap Hashtable区别
public class Hashtable extends Dictionary implements Map, Cloneable, <a href="http://lib.csdn.net/base/javase" class='replace_word' title="Java SE知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Java</a>.io.Serializable
http://blog.csdn.net/shohokuf/article/details/3932967
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
可见Hashtable 继承自 Dictiionary 而 HashMap继承自AbstractMap
Hashtable的put方法如下
1 public synchronized V put(K key, V value) { //###### 注意这里1 2 // Make sure the value is not null 3 if (value == null) { //###### 注意这里 2 4 throw new NullPointerException(); 5 } 6 // Makes sure the key is not already in the hashtable. 7 Entry tab[] = table; 8 int hash = key.hashCode(); //###### 注意这里 3 9 int index = (hash & 0x7FFFFFFF) % tab.length; 10 for (Entry e = tab[index]; e != null; e = e.next) { 11 if ((e.hash == hash) && e.key.equals(key)) { 12 V old = e.value; 13 e.value = value; 14 return old; 15 } 16 } 17 modCount++; 18 if (count >= threshold) { 19 // Rehash the table if the threshold is exceeded 20 rehash(); 21 tab = table; 22 index = (hash & 0x7FFFFFFF) % tab.length; 23 } 24 // Creates the new entry. 25 Entry e = tab[index]; 26 tab[index] = new Entry(hash, key, value, e); 27 count++; 28 return null; 29 }
注意1 方法是同步的
注意2 方法不允许value==null
注意3 方法调用了key的hashCode方法,如果key==null,会抛出空指针异常 HashMap的put方法如下
1 public V put(K key, V value) { //###### 注意这里 1 2 if (key == null) //###### 注意这里 2 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 modCount++; 16 addEntry(hash, key, value, i); //###### 注意这里 17 return null; 18 }
注意1 方法是非同步的
注意2 方法允许key==null
注意3 方法并没有对value进行任何调用,所以允许为null
补充:
Hashtable 有一个 contains方法,容易引起误会,所以在HashMap里面已经去掉了
当然,2个类都用containsKey和containsValue方法。
HashMap Hashtable
父类 AbstractMap Dictiionary
是否同步 否 是
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算法都大概一样,所以性能不会有很大的差异。
转载于:https://www.cnblogs.com/manhuidhu/p/6542388.html
转HashMap Hashtable区别相关推荐
- HashMap Hashtable区别
2019独角兽企业重金招聘Python工程师标准>>> 1.HashMap基础自AbstractMap,Hashtable继承自Dictionary public class H ...
- HashMap Hashtable区别
•HashMap 和 Hashtable 是 Map 接口的两个典型实现类 •区别: –Hashtable 是一个古老的 Map 实现类,不建议使用 –Hashtable 是一个线 ...
- 一个古老的问题HashMap与Hashtable区别
HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable.可能你觉得HashTable很好用,为什么不用呢? ...
- HashTable和HashMap的区别详解
HashTable和HashMap的区别详解 一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同 ...
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
Hash算法 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的 ...
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别(转)
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别 文章来源:http://www.cnblogs.com/beatIteWeNerverGiveU ...
- Hashtable、HashMap 与 HashTable区别、HashMap、Hashtable和TreeMap、 LinkedHashMap
目录 Hashtable的函数都是同步的 HashMap 与 HashTable区别 HashMap.Hashtable和TreeMap LinkedHashMap 特殊新增的构造器 TreeMap ...
- HashTable和HashMap的区别
转载: http://www.importnew.com/24822.html 1.时间 2. 作者 以下是HashTable的作者: 1 2 3 4 5 以下代码及注释来自java.util.Has ...
- 036_Hashtable和HashMap的区别
1. Hashtable和HashMap的区别 1.1. Hashtable线程安全, 效率低; HashMap线程不安全, 效率高 1.2. Hashtable父类是Dictionary; Hash ...
- hashmap删除指定key_HashTable和HashMap的区别详解
一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的, ...
最新文章
- 俄罗斯无人机公司Hoversrf紧随Volocopter步伐,酷炫“方程式”飞行汽车来袭
- 【网络信息安全】授权与访问控制
- 服务器电源输出电压稳定,服务器电源选购指南
- ASP.NET 取得 Request URL 的各个部分
- 大麦无线虚拟服务器,解答大麦盒子无线设置的问题
- Springcloud电子商城系统 java B2B2C-服务消费者(rest+ribbon)
- 短视频直播怎么搭建_直播平台搭建流程
- 三角波c语言编程,51单片机简易波形发生器(正弦波 锯齿波 三角波)仿真+源程序+电路原理图...
- 怎么让照片里的人嘴巴动起来_让照片动起来软件下载-让照片动起来制作软件下载-西西软件下载...
- Windows服务器应该如何保持长时间连接不断开。
- 对自己的反思 (闲暇中的面试总结)
- 获取海康摄像机/录像机rtsp视频流地址格式
- Java的7大设计原则和23种设计模式
- 中国象棋对局软件设计(一)
- 【华为机试真题Python】工厂流水线调度
- 创造与魔法241服务器系统什么时候修好,《创造与魔法》萌新小课堂——如何选择服务器...
- Arduino Ethernet构建简易服务器
- 必看!SQL语法速成手册
- 求101-150的质数
- java中兴参与实参的区别_深入剖析中兴a7s和中兴a7有啥区别?哪个好?真实体验诉说...
热门文章
- 编译WINDOWS版FFmpeg:msys2环境准备
- LINUX下载编译libpng
- 解决办法:configure: error: You requested SRTP (requires libsrtp) but not found...die
- memcpy-avx-unaligned/strcpy_sse2_unaligned崩溃记录
- LINUX上ZIP的使用
- EasyUI配置当点击一个datagrid的checkbox选中或取消选中记录的时候刷新另一个datagrid数据的方法
- python导入mysql慢_如何更高、更快、更强地用python向mysql导入数据
- python 打印三维数据_Python中的面向对象编程(二):数据隐藏和对象打印
- 新手linux版本,六款适用于新手的非Ubuntu Linux发行版
- BOOST库介绍(八)——deadline_timer