我有一个wordcount程序,我从字符数组中读取,并将找到的每个单词(检查空白空间)插入HashMap<Character[], Integer>
,其中第一个参数是单词,第二个参数是数字它被发现的次数。
我不使用StringBuilder或Tokenizer,因为我正在避免使用Strings,因为我正在读取10gb文件,并且因为Strings是不可变的,所以它似乎会导致内存问题。
以下代码在仅读取20-30mb的文件后似乎滞后。问题似乎是我的密钥是Character[]
,所以我的get语句总是返回null。不知道如何在不使用字符串的情况下解决这个问题。
注意 - 我使用ArrayList<Character>
构建单词 - 然后我将数组列表转换为Character []
。我这样做是因为在检查相等性时将ArrayList插入HashMap是非常有问题的。此外,该程序是多线程的,每个线程都有自己的hashmap。
public void run() {
int i = 0; Integer check;
ArrayList<Character> charBuilder = new ArrayList<Character>();
Character [] inserter;
for (i = 0; i < newbyte.length; i++) {
if(newbyte[i] != ' ') {
charBuilder.add(newbyte[i]);
}
else { //delimiter found, insert word into local hashmap, clear builder
//convert to char [] first
inserter = charBuilder.toArray(new Character[charBuilder.size()]);
check = map.get(inserter);
if (check != null) { //already exists an entry
map.put(inserter, check + 1);
}
else {
map.put(inserter, 1);
}
charBuilder.clear();
inserter = null;
}
}
构造函数
BigCountThread3(char[] newbyte,
HashMap<Character[], Integer> hashMap) {
答案 0 :(得分:4)
问题是char []等于。您将字符数组作为键,当您尝试从映射中获取键时,将调用该键的equals方法。由于char数组equals只有当两个键指向同一个引用时才会成立,如果你创建相同的字符数组它将不起作用,因为它们将是两个具有相同字符的不同数组。
此外,我认为将数组作为地图中的关键是一个坏主意。