我有104k个字符串值,其中89k个是唯一的。我想检查一个字符串是否存在于这个列表中。
这是我的类和它的方法,保存了所有这些记录。
public class TestClass {
private static TestClass singletonObj = null;
private List<String> stringList= null;
public static synchronized TestClass getInstance() {
if(singletonObj == null) {
singletonObj = new TestClass();
}
return singletonObj;
}
public boolean isValidString(String token) {
if(stringList == null) {
init();
}
if(stringList != null && token != null && !token.isEmpty())
return stringList.contains(token.toLowerCase());
return false;
}
private init() {
stringList = new ArrayList<String>();
// put all 104k values in this data structure.
}
}
我的应用程序尝试以每秒大约20个请求的并发方式使用此isValidString()
方法。这很好运行,但当我尝试将数据结构更改为HashSet
时,CPU使用率变得非常高。据我理解,Hashset应该比ArrayList[o(n)]更快[o(1)]。有人能解释一下这是为什么吗?
isValidString()
应该有一个同步块,确保init();
只被调用一次。此外,你需要检查null
两次。 - TheLostMindinValidString()
方法同步,那么就失去了多线程的目的,你只需要让if(stringList==null)
这个条件同步即可。 - CodebenderstringList
。但是这样做有什么意义呢?在查询列表之前必须先加载集合,因此并不能实现并行处理。那么为什么不在构造函数中初始化呢? - Chris Martin