java学习之HashMap

2022-08-18 16:17:22 浏览数 (1)

正文

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

与非

先与后非

或非

先或后非

代码语言:javascript复制
& 逻辑与

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

|按位或

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

^(异或运算符)

<<左移运算符

>>右移运算符

~ 取反运算符

>>>无符号右移运算符

0 人点赞