(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
存储long
或BigInteger
中生成的字符总数。
那你可以运行想怎么玩就怎么玩。
我正在构建一个程序,用户可以在其中键入所需的单词,然后将单词逐个字母地放入 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
.
存储long
或BigInteger
中生成的字符总数。
那你可以运行想怎么玩就怎么玩。