【问题标题】:OutOfMemoryError: Java heap space-ArrayLists JavaOutOfMemoryError: Java 堆空间-ArrayLists Java
【发布时间】:2014-05-14 23:42:29
【问题描述】:
    for(int i=0; i<words.size(); i++){
        for(int j=0; j<Final.size(); j++){
        if(words.get(i)==Final.get(j)){
            temp=times.get(j);
            temp=temp+1;
            times.set(j, temp);         
        }
        else{
            Final.add(words.get(i));
            times.add(1);
        }   
        }

}

我想创建两个 ArrayList;次(整数)和最终(字符串)。 ArrayList "words" 包括一个字符串的单词,并且一些单词被多次显示。我想要做的是将“单词”的每个单词(但只有一次)添加到“Final”,并将数字(这个单词出现在“单词”上的次数)添加到“times”。有什么问题吗? 因为我得到 OutOfMemoryError: Java heap space

【问题讨论】:

  • 我会使用 Map&lt;String, Integer&gt; 或 Map&lt;String, int[]&gt;,因为这在 CPU 方面会显着提高效率,但不确定它是否有助于内存。我建议您尝试使用内存分析器,看看是什么占用了这么多内存。
  • 我认为你的内部循环永远不会终止,因为你不断增加 Final 的大小,所以你的终止条件永远不会满足,最终你会用完堆空间。
  • @Ralf 如果单词已经在其中,最终大小只会增加。当循环开始时,它有一定的大小
  • @Ralf 几乎是正确的。您的内部 for 循环状态:对于 Final 中不等于 my word 的每个单词,将 my word 添加到 Final 的末尾。这是指数增长(它会吞噬你的记忆)。逻辑完全错误,试着用一个空的 Final 开始运行它,最后你不会得到字典,只有空列表。

标签: java arraylist out-of-memory


【解决方案1】:

我也认为使用 Hashmap 是最好的解决方案。

在你的代码中,有一个错误,也许你的问题就在这里。 替换以下内容:

        if(words.get(i)==Final.get(j)){

作者:

        if(words.get(i).equals(Final.get(j))){

【讨论】:

    【解决方案2】:

    您不需要两个数组来找出单词及其计数。您可以在使用 hashmap 后获取此详细信息。这个 hashmap 包含 key 作为你的 word 和 value 将是它的计数。 像一个哈希图

    Map&lt;String, Integer&gt; words = new HashMap&lt;String, Integer&gt;();

    然后你可以通过以下方式使用这张地图

            try {
            //getting content from file.
            Scanner inputFile = new Scanner(new File("d:\\test.txt"));
                        //reading line by line
            while (inputFile.hasNextLine()) {
                // SringTokenize is automatically divide the string with space.
    
                StringTokenizer tokenizer = new StringTokenizer(
                        inputFile.nextLine());
                while (tokenizer.hasMoreTokens()) {
                    String word = tokenizer.nextToken();
                    // If the HashMap already contains the key, increment the
                    // value
                    if (words.containsKey(word)) {
                        words.put(word, words.get(word) + 1);
                    }
                    // Otherwise, set the value to 1
                    else {
                        words.put(word, 1);
                    }
                }
    
            }
    
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }// Loop through the HashMap and print the results
        for (Entry<String, Integer> entry : words.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
    
            System.out.println("Word"+key + ": its occurance " + value);
    

    【讨论】:

      【解决方案3】:

      如果您要耗尽内存,它将尝试将所有单词读入一个集合。我建议您不要这样做,而是在获得单词时数数。

      例如

      Map<String, Integer> freq = new HashMap<>();
      try(BufferedReader br = new BufferedReader(new FileReader(filename))) {
          for(String line; (line = br.readLine()) != null; ) {
               for(String word : line.trim().split("\\s+")) {
                    Integer count = freq.get(word);
                    freq.put(word, count == null ? 1 : 1 + count);
               }
          }
      }
      

      【讨论】:

        【解决方案4】:

        试试这个例子。

        String[] words = {"asdf","zvcxc", "asdf", "zxc","zxc", "zxc"};
                Map<String, Integer> result = new HashMap<String, Integer>();
                for (String word : words) {
                    if (!result.containsKey(word)) {
                        result.put(word, 1);
                    } else {
                        result.put(word, result.get(word) + 1);
                    }
                }
                //print result
                for (Map.Entry<String, Integer> entry : result.entrySet()) {
                    System.out.println(String.format("%s -- %s times", entry.getKey(), entry.getValue()));
                }
        

        输出:

        zvcxc -- 1 次

        zxc -- 3 次

        asdf -- 2 次​​p>

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-17
          相关资源
          最近更新 更多