【问题标题】:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space while using util Packages线程“main”中的异常 java.lang.OutOfMemoryError: Java heap space while using util Packages
【发布时间】:2018-08-19 11:57:29
【问题描述】:

我的问题陈述:

在一个文件中会有一组单词(>5000 个单词)。我们需要在每个字符串(字谜集)中返回一个以逗号(,)分隔的字谜列表 eg:[alter,later,part,trap,bow,below,listen,silent,tensil]

例外:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:265)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
at java.util.ArrayList.add(ArrayList.java:462)
at FindAnagrams01.anagramsList(FindAnagrams01.java:25)
at FindAnagrams01.main(FindAnagrams01.java:7)

我的代码是:

  public static List<String> anagramsList(String filePath) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(filePath));
    String str = br.readLine();
    List<List<String>> result = new ArrayList<List<String>>(10000);
    HashMap<String, ArrayList<String>> map = new HashMap<String,ArrayList<String>>(10000);
    while(str != null) {
        char[] arr = new char[26];
        for(int i = 0; i < str.length(); i++) {
            arr[str.charAt(i) - 'a']++;              
        }
        String ns = new String(arr);
        if(map.containsKey(ns)){
            map.get(ns).add(str);
        } else {
            ArrayList<String> al = new ArrayList<String>(10000);
            al.add(str);
            map.put(ns, al);
        }
    }
    br.close();
    result.addAll(map.values());
    String res[] = new String[10000];
    for(int i = 0; i < result.size(); i++) {
        int isIntial = 0;
        for(String j : result.get(i)) {
            if ((result.get(i).size()) > 1) {
                if (isIntial == 0) {
                    res[i] = j;
                    isIntial = 1;
                }
                else
                    res[i] += "," + j;
            } 
        }
    }
    List<String> angrms = new ArrayList<String>(10000);
    for (int i = 0; i < res.length; i++) {
        if (res[i] != null)
            angrms.add(res[i]);
    }
    return angrms;
}

【问题讨论】:

  • HashMap&lt;String,arrayList&lt;String&gt;&gt; - 什么?您是否手动输入了此代码?什么是arrayList?任何你为什么将所有内容都设置为 10,000?这是你最喜欢的号码吗?
  • 你为什么在char[]上打电话给++?? arr[str.charAt(i) - 'a']++.
  • 这段代码很奇怪,有很多方法——目前它不能编译,更不用说抛出任何Exceptions
  • 你有一个循环 while(str != null) { 但在里面你永远不会改变 str,所以它永远不会结束
  • 在 char[i]++ 中。我实际上正在设置一个唯一的字符串来查找该特定键的字谜,并且我想将我的文件限制为 10000 个单词。

标签: java file exception arraylist out-of-memory


【解决方案1】:

问题是这是一个无限循环:

while(str != null) {
    char[] arr = new char[26];
    for(int i = 0; i < str.length(); i++) {
        arr[str.charAt(i) - 'a']++;              
    }
    String ns = new String(arr);
    if(map.containsKey(ns)){
        map.get(ns).add(str);
    } else {
        ArrayList<String> al = new ArrayList<String>(10000);
        al.add(str);
        map.put(ns, al);
    }
}

因为str 在循环体内没有改变。结果,您最终会反复向数组列表添加字符串,直到最终耗尽内存。

您的代码还有其他问题......但这解释了您的 OOME。

【讨论】:

  • 我能知道这些问题是什么
  • 好吧,首先,我看不到任何生成字谜的代码。
  • char arr[26] 表示 26 个字母,当我发现特定的字母索引将其增加到一个将空字符替换为空字符后的字符时,它会为一组字谜生成一个唯一的键。
  • 哦。我知道了。所以它不会生成字谜。它正在检测它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 2013-02-25
  • 2016-04-15
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
相关资源
最近更新 更多