为什么HashTable的默认大小和HashMap不一样
答案:2 悬赏:80
解决时间 2021-04-22 23:26
- 提问者网友:追忆成伤
- 2021-04-22 09:07
为什么HashTable的默认大小和HashMap不一样
最佳答案
- 二级知识专家网友:啵啵桃汀
- 2021-04-22 09:46
Hashtable的扩容是这样做的:
int oldCapacity = table.length;
int newCapacity = oldCapacity * 2 + 1;
虽然不保证capacity是一个质数,但至少保证它是一个奇数。
Hashtable的寻址是这样做的:
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
直接用key的hashCode(),不像HashMap里为了增强hash的分散效果而要做二次hash(这里例子用JDK6版,老一点方便):
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
int hash = (key == null) ? 0 : hash(key.hashCode()); // 二次hash
table[indexFor(hash, table.length)]
int oldCapacity = table.length;
int newCapacity = oldCapacity * 2 + 1;
虽然不保证capacity是一个质数,但至少保证它是一个奇数。
Hashtable的寻址是这样做的:
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
直接用key的hashCode(),不像HashMap里为了增强hash的分散效果而要做二次hash(这里例子用JDK6版,老一点方便):
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
int hash = (key == null) ? 0 : hash(key.hashCode()); // 二次hash
table[indexFor(hash, table.length)]
全部回答
- 1楼网友:苦柚恕我颓废
- 2021-04-22 10:01
1 hashmap不是线程安全的
hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。hashmap允许null key和null value,而hashtable不允许。
2 hashtable是线程安全的一个collection。
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 就必须为之提供外同步。
hashtable和hashmap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
public static void main(string args[])
{
hashtable h=new hashtable();
h.put("用户1",new integer(90));
h.put("用户2",new integer(50));
h.put("用户3",new integer(60));
h.put("用户4",new integer(70));
h.put("用户5",new integer(80));
enumeration e=h.elements();
while(e.hasmoreelements()){
system.out.println(e.nextelement());
}
map 的方法:
clear()从 map 中删除所有映射
remove(object key)从 map 中删除键和关联的值
put(object key, object value)将指定值与指定键相关联
get(object key)返回与指定键关联的值
containskey(object key)如果 map 包含指定键的映射,则返回 true
containsvalue(object value)如果此 map 将一个或多个键映射到指定值,则返回 true
isempty()如果 map 不包含键-值映射,则返回 true size()返回 map 中的键-值映射的数目
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |