将Character数组插入hashmap

时间:2014-10-20 20:40:46

标签: java arrays concurrency hashmap

我有一个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) { 

1 个答案:

答案 0 :(得分:4)

问题是char []等于。您将字符数组作为键,当您尝试从映射中获取键时,将调用该键的equals方法。由于char数组equals只有当两个键指向同一个引用时才会成立,如果你创建相同的字符数组它将不起作用,因为它们将是两个具有相同字符的不同数组。

此外,我认为将数组作为地图中的关键是一个坏主意。