第四个不同就是它们两个Hash值的获取方式了。
还是通过源代码源代码,Hashtable是直接使用key对象的hash值。
Java代码
public synchronized V put(K key, V value) {
if (value == null) {
throw new NullPointerException();
}
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
} |
而HashMap则是利用key对象的hash值重新计算一个新的hash值。
Java代码
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
}
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
} |
小花:胖子,都用了hash算法,你给我讲讲Hash算法吧。
小胖:嗯……以后的,今天我比较忙(其实是不会)。
小花:你是不是不会啊?嘿嘿(坏笑)。
小胖:什么不会……谈下一话题……
第五个不同就是Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。
HashMap中内部数组的初始容量是16, 加载因子为0.75,而且数组容量增容后也要是2指数次幂:
Java代码
static final int DEFAULT_INITIAL_CAPACITY = 16;
static final float DEFAULT_LOAD_FACTOR = 0.75f; |