java - 将字符数组插入 HashMap

标签 java arrays concurrency hashmap

我有一个字数统计程序,我正在从字符数组中读取内容,并将找到的每个单词(检查空格)插入到 HashMap<Character[], Integer> 中。 ,其中第一个参数是单词,第二个参数是该单词被找到的次数。

我不使用 StringBuilder 或 Tokenizer,因为我避免使用字符串,因为我正在读取 10gb 文件,并且由于字符串是不可变的,因此它似乎会导致内存问题。

以下代码在仅读取 20-30mb 的文件后似乎出现滞后。问题似乎是我的 key 是 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) { 

最佳答案

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

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

关于java - 将字符数组插入 HashMap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26474545/

相关文章:

java - JTextArea 未在 gui 中更新

java - 学习 Java Portlet 规范 (JSR-168) 的最佳资源是什么?

c - C 上的快速排序错误

java - 由 : java. lang.NoSuchMethodError : org. hibernate.internal.CoreMessageLogger.debugf(Ljava/lang/String;II)V 引起 - 在 Spring REST 示例中

java - WeakHashMap 的 keySet 条目永远不会为空吗?

php - 优化我的循环以返回而不是执行 10 次查询

php - 如何在 PDO 中创建具有列名的多维数组

java - 确保所有等待线程完成

java - 如果线程不更改映射结构,我应该使用 ConcurrentHashMap 还是 HashMap?

java - 从 ActiveMQ 并行消费消息