您的位置:首页 > 其它

HashTable和HashMap比较

2018-01-25 17:09 232 查看

HashTable源码

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable{}


HashTable源码定义

这个类实现了一个哈希表,它将键映射到值。任何非空对象都可以用作键或值。

HashMap源码

public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable


HashMap源码定义

基于哈希表的映射接口实现。该实现提供了所有可选的映射操作,并允许null值和null键。(HashMap类大致相当于Hashtable,除了它是不同步的,并且允许null)

注:java中两种数据存储方式:

数组查询速度快,增删较慢原因:连续空间,按下标可实现快速查询,但每次增删,数组的全体下标会重新排列
链表查询速度慢、增删快原因:不连续空间,链式结构,增删元素只需修改指针,查询则需遍历。
哈希表是两者优势的结合。

HashMap和HashTable比较

内容HashMapHashTable
存储机制哈希表(数组+链表)哈希表(数组+链表)
线程线程不安全线程安全(内部的大多数方法有synchronized 修饰)
性能优秀已淘汰
是否为null允许为null值,源码中会将null值会调用putForNullKey(value)方法,将[null,value]放在table[0]的位置不允许为null,否则抛出 NullPointerException 异常
默认初始数组16(扩容时乘2,使用位运算取得哈希,效率高于取模)11(乘2加1,都是素数和奇数,取模哈希结果更均匀)
//HashMap的散列函数,这里传入参数为键值对的key
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
//返回hash值的索引,h & (length-1)操作等价于 hash % length操作, 但&操作性能更优
static int indexFor(int h, int length) {
// length must be a non-zero power of 2
return h & (length-1);
}

//HashTable的散列函数直接在put方法里实现了
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: