作者:mobiledu2502892377 | 来源:互联网 | 2023-05-16 20:30
Hashtable与Hashmap按理说是一样的,但是为什么使用后者的效率要明显高于前者?
有谁知道吗??
谢谢!
11 个解决方案
HashTable 是线程安全的,HashMap则不是线程安全的,在多线程的环境了,如果自己不想控制线程间的同步和互斥的话可以用Hashtable,否则其他情况下最好用Hashmap,因为Hashmap没有考虑线程间的同步于互斥,所以效率较Hashtable要高
引用一下网上的话:
“
1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
4.HashTable使用Enumeration,HashMap使用Iterator。
以上只是表面的不同,它们的实现也有很大的不同。
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
int h = x.hashCode
}
”
两线程:A,B,数据a= 16
A B
读a = 16
读a = 16
a= a -1
写回:15
a = a -1
写回15
B应该写回14才对,上面的例子相当于 16- 2 = 15 。这设计到对临界资源的访问问题
这就不安全了。不知道是不是这样!现在在学操作系统
面试题,哈哈
HashTable HashMap
前者线程安全,即效率相对低些
后面非线程安全,即效率相对高些
前者不可以有null值
后者可以有null值
................
我面试的时候就有这道题!还有arraylist呢!
TO escalj(天行健,君子以自强不息)
HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
int h = x.hashCode
}
和hashtable相比,这样做有什么好处???
escalj(天行健,君子以自强不息)已经说的全面了,如果还不明白可以多查查书1
记得ArrayList线程不安全,Vector线程安全
我所理解的线程安全或者不安全,指的是多线程环境下使用一个实例,会不会因为一个线程中改变了实例状态,而对另一个正使用该实例的线程的工作造成影响。