java学习之HashMap


[TOC]

正文

HashMap的扩容机制

Hashtable、HashMap和ConcurrentHashMap的异同

主要区别有线程安全性、同步(synchronization)以及速度

1、HashMap从结构上看几乎可以等价于Hashtable;HashMap可以接受null的key和value但是Hashtable不行

HashMap 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同步

Map m=Collections.synchronizedMap(HashMap);

2、如果你需要完全的线程安全额时候使用Hashtable

​ 如果是Java 5以上请使用ConcurrentHashMap(使用锁分段技术来保证线程安全)

参考地址

Hashtable、HashMap和ConcurrentHashMap的异同

HashMap这样回答offer就稳了

HashTable,ConcurrentHashMap这些你知道吗

笔记

笔记1

计算机中的逻辑运算(与、或、非、异或、同或、与非、或非)

名称 描述
全1为1,有0为0
全0为0,有1为1
0->1 1->0
异或 不同为1,相同为0
同或 相同为0,相同为1
与非 先与后非
或非 先或后非
& 逻辑与

&& 逻辑与 (逻辑运算符)逻辑与也称为短路逻辑与

|按位或

|| 逻辑或  一个为真即为真,后续不再计算

^(异或运算符)

<<左移运算符

>>右移运算符

~ 取反运算符

>>>无符号右移运算符

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=33i3ekx3p38k8


文章作者: 毛豆不逗比
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 毛豆不逗比 !
  目录
{% include '_third-party/exturl.swig' %} {% include '_third-party/bookmark.swig' %} {% include '_third-party/copy-code.swig' %} + {% include '_custom/custom.swig' %}