Java基础-了解Hashtable
2016-01-22 14:12
363 查看
Hashtable和HashMap都是Map接口的实现类,方法是一样的,实现也差不多,主要说下不同
*Hashtable线程安全,HashMap非线程安全。
Hashtable主要是在各个关键操作(put、putAll、get等)加了synchronized关键字来保证线程安全。这样也导致了Hashtable效率要低些。因为n个线程都会抢一把锁,无论读或者写,抢到的线程进行操作,抢不到的只能等了。
*Hashtable不允许null值,HashMap允许
*Hashtable继承了Dictionary,HashMap则继承了AbstractMap,据说是因为历史原因(Hashtable从jdk1.0就有了,HashMap到1.2才有的)
*数组下标bucketIndex计算方式不同
HashMap是让hash值与(length-1)进行&运算获得
Hashtable是进行取余获的,前面的&运算是为了保证值为正数(如果本身就是正数,计算的结果和原本的hash值是一样的),再进行取余
*Hashtable线程安全,HashMap非线程安全。
Hashtable主要是在各个关键操作(put、putAll、get等)加了synchronized关键字来保证线程安全。这样也导致了Hashtable效率要低些。因为n个线程都会抢一把锁,无论读或者写,抢到的线程进行操作,抢不到的只能等了。
*Hashtable不允许null值,HashMap允许
//Hashtable的put操作 public synchronized V put(K key, V value) { // Make sure the value is not null if (value == null) { throw new NullPointerException(); } ... }
*Hashtable继承了Dictionary,HashMap则继承了AbstractMap,据说是因为历史原因(Hashtable从jdk1.0就有了,HashMap到1.2才有的)
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{ ... }
*数组下标bucketIndex计算方式不同
HashMap是让hash值与(length-1)进行&运算获得
static int indexFor(int h, int length) { return h & (length-1); }
Hashtable是进行取余获的,前面的&运算是为了保证值为正数(如果本身就是正数,计算的结果和原本的hash值是一样的),再进行取余
index = (hash & 0x7FFFFFFF) % tab.length;
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树