正文
HashMap的扩容机制
Hashtable、HashMap和ConcurrentHashMap的异同
主要区别有线程安全性、同步(synchronization)以及速度
1、HashMap从结构上看几乎可以等价于Hashtable;HashMap可以接受null的key和value但是Hashtable不行
2、HashMap是非同步(synchronized),Hashtable是同步的;这说明Hashtable是线程安全的,多个线程可以共享一个Hashtable;如果没有正确同步的话,多个线程是无法安全的访问HashMapJava5提供了ConcurrentHashMap是Hashtable的替代,它比Hashtable的性能和扩展性更好
HashMap部分源码截取 | Hashtable部分源码截取 |
---|---|
public final void forEach(Consumer<? super K> action) {} | public synchronized void forEach(BiConsumer<? super K, ? super V> action) {} |
public final void remove() {} | public synchronized V remove(Object key) {} |
public V put(K key, V value){} | public synchronized V put(K key, V value) { |
3、另一个区别是两个迭代器不同:HashMap的迭代器是(Iterator)是fast-fail迭代器,而Hashtable的迭代器(Enumeration)不是fast-fail迭代器;所以当其他线程改变HashMap的结构(增加或者删除)就会抛出CME(ConcurrentModification 并发修改错误这个错误在单线程中使用迭代器修改HashMap结构的时候(增加和删除)也会引发此错误),当然这个错误也不是一定会发生,具体就要看另一篇 迭代器Enumeration和Iterator的区别
4、由于Hashtable都是线程同步的,所以在单线程环境下比HashMap要慢,如果不需要同步而且是单线程环境,那么HashMap性能要好过Hashtable
5、HashMap不能保证随着时间推移Map中的元素次序是不变的(没整明白)HashMap
_注:_1、是否能让HashMap同步
代码语言:javascript复制Map m=Collections.synchronizedMap(HashMap);
2、如果你需要完全的线程安全额时候使用Hashtable
如果是Java 5以上请使用ConcurrentHashMap(使用锁分段技术来保证线程安全)
迭代器
Java学习之迭代器
参考地址
Hashtable、HashMap和ConcurrentHashMap的异同
HashMap这样回答offer就稳了
HashTable,ConcurrentHashMap这些你知道吗
笔记
笔记1
计算机中的逻辑运算(与、或、非、异或、同或、与非、或非)
名称 | 描述 |
---|---|
与 | 全1为1,有0为0 |
或 | 全0为0,有1为1 |
非 | 0->1 1->0 |
异或 | 不同为1,相同为0 |
同或 | 相同为0,相同为1 |
与非 | 先与后非 |
或非 | 先或后非 |
& 逻辑与
&& 逻辑与 (逻辑运算符)逻辑与也称为短路逻辑与
|按位或
|| 逻辑或 一个为真即为真,后续不再计算
^(异或运算符)
<<左移运算符
>>右移运算符
~ 取反运算符
>>>无符号右移运算符