(Java) 删除 ArrayList 元素会增加 space 内存吗?

(Java) Will removing ArrayList elements make more space in 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.

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

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)

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

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万个字符长。我想达到我可以使用整个段落作为所需单词并让程序 运行 几天直到它随机键入它的地步。所有帮助将不胜感激。谢谢。

您得到 out of memory error 是因为您的代码不断添加字符,而您不需要这样做。在你的 do-while nest 中为 randomArray 创建一个新的 ArrayList 或在最后 for loop.

中对 randomArray 使用 removeAll

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

那你可以运行想怎么玩就怎么玩。