java - 添加到大型 Java 集合,性能瓶颈

标签 java performance collections

我正在尝试将一百万个对象添加到列表中。这样做所需的时间比我耐心等待的时间要长。进行每一步似乎也需要越来越长的时间。

    int size = 1000000;
    Deque<DatastoreElement> content = new LinkedList<DatastoreElement>();

    for (int i = 0; i < size; i++) {

        String k = Utils.getRandomStringOfLength(20);
        String v = Utils.getRandomStringOfLength(300); // goes faster with smaller number

        int metaHash = random.nextInt(10) + 1;
        KVPair kvp = new KVPair(k, v);
        DatastoreElement dse = new DatastoreElement(metaHash, kvp);

        content.addLast(dse); // confirmed problem is here

        if (i % 10000 == 0) {
            System.out.println(i);
        }
    }

我尝试将内容添加到 ListSet,结果非常相似。它启动很快,并在一些数字后窒息。

我应该使用什么集合来存储大量相似的元素?我在这里遗漏了一些简单的东西吗?

最佳答案

这个问题一般不会出现在集合中,不会出现在 LinkedList 中(具有 O(1) 添加特性) .

因此,可能的嫌疑人正在抖动/交换内存。 确保JVM有足够的内存,系统有更多..

LinkedList 切换到 ArrayList(或 ArrayDeque)将保持 O(1) 摊销 性能,但可能每个项目的开销略微。 (开销,以及这种减少是否重要,取决于添加的对象的大小和后备存储的填充率。)

关于java - 添加到大型 Java 集合,性能瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12081867/

相关文章:

Java - 检索列表中的类型数量

java - 设置我的 jnlp 以使用特定的 java 路径运行

java - 错误org.springframework.beans.factory.BeanCreationException : Error creating bean Spring Boot

java - 您会选择什么来在 Java 应用程序中运行 HTML/Javascript

mysql - 最近一小时的唯一条目 MySQL

c# - 在 C# List<String> 中搜索子字符串的更快方法

java - python vs java 用于存储字典的内存

c# - DataGridView 控件的至少一列没有单元格模板

c# - 为什么 ReadOnlyCollection<> 不包含 FindAll()、FindFirst()、

java - 由于 ClassCastException,应用程序无法运行