填充大型列表

时间:2016-08-09 09:24:09

标签: java list

在制作中,我将不得不填充相当大的字符串集合(包含大约100M字符串)。我不需要遍历它,只需填充并保持原样。

我必须坚持下去,但这是另一个线程的责任。

我认为填充LinkedListArrayList更有效率。 这是一个简单的程序:

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)

0 个答案:

没有答案