HashMap 和 Hashtable
来源:互联网 发布:淘宝哪个买正品乔丹 编辑:程序博客网 时间:2024/06/05 16:37
学习过程中,遇到了HashMap和Hashtable的问题,各种查询找到了很多总结的很棒的文章和资料,为了更好的学习,小编个人对HashMap 和 Hashtable做一个系统的小结。
对于HashMap 和 Hashtable,文章从它们的相同点和不同点分别入手,简单认识HashMap 和 Hashtable。
相同点
存储方式相同,利用一个内部类,实现的是Map.Entity接口,内部实现不一样,但是都是以节点方式进行存储的。是一种单向链表,链表是基于数组的。
不同点
1.先看两个类:
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
可以得出,Hashtable继承自Dictiionary;
HashMap继承自AbstractMap。
他们分别继承不同的类。
2.HashMap可以允许key为null,value为null,HashTable都不允许为null
public synchronized V put(K key, V value) { // Make sure the value is not null if (value == null) { throw new NullPointerException(); } // Makes sure the key is not already in the hashtable. Entry<?,?> tab[] = table; int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; @SuppressWarnings("unchecked") Entry<K,V> entry = (Entry<K,V>)tab[index]; for(; entry != null ; entry = entry.next) { if ((entry.hash == hash) && entry.key.equals(key)) { V old = entry.value; entry.value = value; return old; } } addEntry(hash, key, value, index); return null; }可以看到第4行判断了 value 是否为null,那么key是否为null在哪判断的呢?
大家注意第9行,这里我们调用了key的一个方法hashCode(),这里如果是null的话,这里就不会报错,就会抛出异常。所以key为null的时候,到这里会抛出异常。
既然这样那么为什么HashMap中的key可以为null呢?
这是因为HashMap和HashTable它们计算一个对象的hashCode时的方法不一样。HashMap不是直接用对象自己的hashCode,而是自己重新计算一下hashCode,而HashTable直接用对象本上的hashCode,
并没有再进行计算。这个地方HashMap会稍慢一点HashTable。
3.同步机制不同
HashMap没有提供同步机制,是线程不安全的,需要自己在外面写同步代码;
HashTable 部分方法上有自己的 synchronize 同步,是线程安全的。
由于HashMap是线程不安全的,所以效率可能会高一点,而且在类外面控制线程安全更灵活。
4.HashMap中没有contains方法,而在Hashtable中有一个contains方法。
将以上不同点绘制成表格形式如下:
- Hashtable和HashMap对象
- HashMap和Hashtable区别
- Hashtable和HashMap类
- Hashtable和HashMap
- Hashtable和HashMap
- Hashtable和HashMap
- hashMap和HashTable
- HashMap 和 HashTable
- Java Hashmap 和 Hashtable
- hashtable 和hashmap比较
- HashSet 、HashMap 和 HashTable
- hashtable和hashmap区别
- HashMap和Hashtable
- HashMap和HashTable
- hashtable和hashmap比较
- HashMap和HashTable
- hashmap和hashtable
- HashTable,HashMap和TreeMap
- oracle根据身份证更新出生日期(15位与18位身份证都可)
- sql语句拼接
- 几个优化方法
- VS2015 C#6.0 中的那些新特性
- 网络回调
- HashMap 和 Hashtable
- Eclipse控制台输出信息的控制
- [Android6.0][RK3399] 去掉滑动锁屏(swipe lock)
- Android 文件打开方式用setDataAndType方式
- node.js之框架
- MYSQL MVCC 实现原理
- jenkins安装,配置git项目
- 从零开始的 Python 爬虫速成指南
- android6.0/7.0打开系统权限