java - (Java) 删除 ArrayList 元素会在内存中腾出更多空间吗?

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

最佳答案

您遇到内存不足错误,因为您的代码不断添加字符,而您不需要这样做。在您的 do-while 嵌套 中为 randomArray 创建一个新的 ArrayList,或者在最后一个 for 循环 中对 randomArray 使用 removeAll。

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

然后你想运行多久就运行多久。

关于java - (Java) 删除 ArrayList 元素会在内存中腾出更多空间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48428301/

相关文章:

java - 如何处理大字符串和有限的内存

C# List<T> 内存不足异常但远离 2Gb 限制

java - 如何处理 Pattern.compile 中的双引号?

java - 消除 CXF 生成的代码中对 javax.xml.bind.JAXBElement<java.lang.Boolean> 的冗余强制转换警告

java - 人物提取挑战

java - ArrayList 中的数据到 Listview 中

java - 安全地从 Java ArrayList 中删除项目

java - 在Java中如何调用默认的媒体播放器来播放wav文件?

java - 带有 FlowLayout 的 JPanel 未出现

android - Android 上的 OutOfMemory 异常