Java知识问答

使用synchronized修饰静态方法和非静态方法有什么区别?

为什么wait, notify 和 notifyAll这些方法不在thread类里面?

简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中,因为锁属于对象。

HashMap是线程安全的吗?如何实现线程安全?

HashMap的key和value都能为null么?如果key能为null,那么它是怎么样查找值的?

HashMap对象的key、value值均可为null。
hashMap是根据key的hashCode来寻找存放位置的,那当key为null时, 怎么存储呢?
在put方法里头,其实第一行就处理了key=null的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (key == null)  
return putForNullKey(value);
//那就看看这个putForNullKey是怎么处理的吧。
private V putForNullKey(V value) {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
if (e.key == null) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(0, null, value, 0);
return null;
}
JAVA

可以看到,前面那个for循环,是在talbe[0]链表中查找key为null的元素,如果找到,则将value重新赋值给这个元素的value,并返回原来的value。
如果上面for循环没找到则将这个元素添加到talbe[0]链表的表头。


Java知识问答
https://leehoward.cn/2022/03/30/Java知识问答/
作者
lihao
发布于
2022年3月30日
许可协议