gpt4 book ai didi

java - java.util.HashSet 中的映射如何变为 null

转载 作者:太空宇宙 更新时间:2023-11-04 10:17:31 28 4
gpt4 key购买 nike

我在 myset.contains(obj) 和堆栈跟踪中遇到 NullPointerException,如下所示:

java.lang.NullPointerException: null
at java.util.HashSet.contains(HashSet.java:203) ~[?:1.8.0_131]

我查看了HashSet的源代码,

private transient HashMap<E,Object> map;
...
202 public boolean contains(Object o) {
203 return map.containsKey(o);
204 }

看来map是空的,而我的HashSet对象不是。但是HashSet的每个init方法都会创建一个HashMap对象并分配给map,就像

public HashSet() {
map = new HashMap<>();
}

所以我的问题是,为什么map在第203行会变成空?

这种情况有时会发生在我们的网络服务器中,myset 被多个线程使用。我知道非线程安全的 HashSet 上可能存在不一致的问题,但我不明白为什么它变成了空。

提前致谢。

在这里发布我的代码:

Set<String> tags = data.getTags();
if (tags.contains(tmp.toString())) {
return true;
}

数据的类定义,由多个线程访问:

class Data
private Set<String> tags;

public Set<String> getTags() {
if (tags == null) {
tags = new HashSet<String>();
// add something to tags
}
return tags;
}

最佳答案

我认为其他线程可能存在问题,因为在这段代码中,它永远不会更改 map 。它只是进行 conatinsKey 检查,不会改变 map 。

您需要检查 map 中的哪些位置(在各个线程中)正在进行更改,以便验证这一点。

关于java - java.util.HashSet 中的映射如何变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51512661/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com