(Java)删除ArrayList元素会在内存中占用更多空间吗?

时间:2018-01-24 17:22:58

标签: java arraylist out-of-memory

我正在构建一个程序,其中用户键入所需的单词,并将该单词逐字母放入ArrayList中。然后开始随机字母生成器,然后将生成的每个字母放入另一个ArrayList中。然后比较两个列表中的字母,并且一旦发生器随机拼写所需的单词,程序就停止。

高概率的执行看起来像这样:

Would you like to use: 
1. Lowercase Letters 
2. Uppercase Letters 
3. Numbers 
4. Special Characters 
5. Space
(Example, if you'd like to use Lowercase Letters and Numbers, type "13")
1
What character(s) would you like to be tested? 
(Example: "RaNdOm123", "Stephen")
j

u
f
p
b
z
t
j
Successful! 7 characters generated until completion.

但是当概率非常低时,程序会运行并最终显示此异常:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.ArrayList.grow(Unknown Source)
    at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
    at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
    at java.util.ArrayList.add(Unknown Source)
    at Generator.stringGenerator(Generator.java:53)
    at Driver.main(Driver.java:16)

这是创建和比较ArrayLists的代码:

for (int i = 0; i < desiredText.length(); i++) {
            desiredArray.add(desiredText.charAt(i));
        }
        boolean proceed = true;
        int k = 0;
        int l = 0;
        do {
            Random r = new Random();
            for (int i = 0; i < desiredText.length(); i++) {
                int n = r.nextInt(limit);
                randomArray.add(line.charAt(n));
                System.out.println(randomArray.get(k));
                k++;
                if (!desiredArray.get(i).equals(randomArray.get(l))) {
                    l++;
                    break;
                } else {
                    l++;
                }
                if (i == desiredText.length() - 1) {
                    proceed = false;
                    System.out.println("Successful!");
                    System.out.println(randomArray.size() + " characters generated until completion.");
                    break;
                }
            }
        } while (proceed == true);

我正在考虑检查randomArray的大小是否大于desiredText的长度。如果是,那么我将删除数组的第一个元素并循环整个过程。那会少用内存吗?如果没有,您对如何修改代码有任何建议吗?因此广泛的ArrayList不会抛出此异常?成功创建所需单词的最大ArrayList长度约为6500万个字符。我想达到我可以使用整个段落作为所需单词的程度,让程序运行几天直到它随机输入它。所有帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

您收到out of memory error,因为您的代码会不断添加字符,而您不需要这些字符。在do-while nest中为randomArray创建一个新的ArrayList,或在最后for loop的randomArray上使用removeAll。

存储在longBigInteger生成的字符总数。

然后你可以根据需要运行它。