Vector 线程安全吗,HashTable线程安全吗

Vector 他的实现原理和ArrayList,只不过在增删查改的时候,加了锁标记。

Vector 不是绝对的线程安全。

 

比如线程有现在A和B,同时add的话,因为add方法加了锁标记synchronized,所以如果A先拿到了这个锁,这个锁就是这个对象的实例,然后B必须要等待,等A释放锁之后,会去那锁,这时候都是安全的

 

但是现在就是代码里面写了,先判断这个里面contains 有没有这个值,如果没有这个值,在调用add,这样就会有问题,比如A在调用Add的时候,B正好在走到了判断是否包含对的,那这样b在add时候,其实这样就会加入重复的。

因为他的contains没有加锁,所以他不是绝对安全的。

 

HashTable 所有的方法都加了锁标记,所以他是线程安全的。

 

HashTable 和 HashMap的主要的比较

2个的存储结构都差不多,但是hash值的算法都不一样,HashTable默认的初始大小为11,之后每次扩充为原来的2n+1,但是HashMap都是2的幂次方。

也就是说HashTable会尽量使用素数、奇数。而HashMap则总是使用2的幂作为哈希表的大小。我们知道当哈希表的大小为素数时,简单的取模哈希的结果会更加均匀,

所以hashTable的大小选择比较好,但是果模数是2的幂,那么我们可以直接使用位运算来得到结果,效率要大大高于做除法。所以从hash计算的效率上,又是HashMap更胜一筹

 

Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为key和value都是Object类型,但运行时会抛出NullPointerException异常

HashMap中 ,key 和value 可以是null。

 

posted @ 2018-04-12 14:34  tangw  阅读(4661)  评论(0编辑  收藏  举报