在制作中,我将不得不填充相当大的字符串集合(包含大约100M字符串)。我不需要遍历它,只需填充并保持原样。
我必须坚持下去,但这是另一个线程的责任。
我认为填充LinkedList
比ArrayList
更有效率。
这是一个简单的程序:
public static void main(String[] args) {
long start2 = System.nanoTime();
Collection<String> col = new ArrayList<>(); // <---HERE
for (long i = 0; i < 100000000; i++) {
col.add(String.valueOf(i));
if (i % 1000000 == 0)
System.out.println(i);
}
long end2 = System.nanoTime();
System.out.println(end2 - start2);
System.out.println(col.hashCode() == System.nanoTime());
}
对于ArrayList
,平均结果为:61535592462
但如果我用LinkedList
替换它,程序甚至都没有完成。它总是停在84000000
。
为什么?你能解释这些行为的潜在原因吗?它是特定于平台的吗?
我使用Ubuntu 16.04
+ java 8
。
UPD:很长一段时间后,带有LinkedList的程序就会用以下内容完成:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.LinkedList.linkLast(LinkedList.java:142)
at java.util.LinkedList.add(LinkedList.java:338)
at com.test.App.main(App.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)