【发布时间】:2015-08-06 08:01:57
【问题描述】:
我有 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.
}
}
我的应用程序尝试同时使用这个isValidString() 方法,每秒大约有 20 个请求。这工作正常,但是当我尝试将数据结构更改为HashSet 时,CPU 使用率变得非常高。根据我的理解,Hashset 应该比 ArrayList[o(n)] 表现更好[o(1)]。谁能解释一下为什么会这样?
【问题讨论】:
-
你的
init()方法不应该在同步块中吗? -
同意@Codebender 如果你的调用是单例的那么你可以在getInstance()的时候创建它,我相信它永远只有一个列表或集合。
-
@Sthita - 你的
isValidString()应该有一个同步块,确保init();只被调用一次。您还需要检查null两次。 -
@ankitkatiyar91,如果你让
inValidString()同步它会破坏多线程的整个目的,你应该只让if(stringList==null)条件同步。 -
拥有一个延迟加载的
stringList的延迟实例化单例有什么意义?您必须在查询有意义之前加载集合,因此您不会在那里获得任何并行性。那么为什么不在构造函数中初始化呢?
标签: java performance arraylist hashset