列表<Double>使用双[]的RAM?

2022-09-02 09:24:34

Java专家强调避免过早优化的重要性,而是专注于干净的OO设计。我试图在重写使用大量长元素(几百万)的程序的上下文中协调这一原则。似乎使用ArrayList将消耗大约3倍于原始长数组的内存,并且浪费这么多RAM对我来说似乎是一个合理的担忧。

我基于我使用此处描述的MemoryTestBench类进行的实验。我的测试和输出如下:

package memory;

import java.util.ArrayList;
import java.util.List;

public class ArrayListExperiment {

public static void main(String[] args) {

    ObjectFactory arrayList = new ObjectFactory() {
        public Object makeObject() {
            List<Long> temp = new ArrayList<Long>(1000);
            for (long i=0; i<1000; i++)
                temp.add(i);
            return temp;
        }
    };

    ObjectFactory primitiveArray = new ObjectFactory() {
        public Object makeObject() {
            long[] temp = new long[1000];
            for (int i=0; i<1000; i++)
                temp[i] = i;
            return temp;
        }
    };

    MemoryTestBench memoryTester = new MemoryTestBench();
    memoryTester.showMemoryUsage(primitiveArray);
    memoryTester.showMemoryUsage(arrayList);
}
}

和输出:

memory.ArrayListExperiment$2 produced [J which took 8016 bytes
memory.ArrayListExperiment$1 produced java.util.ArrayList which took 24968 bytes

我的问题是:如何获得OO列表的好处,同时仍然保留原始数组的小内存占用?我认为番石榴可能会提供答案,但是浏览API时,我不清楚使用哪个类来代替ArrayList。

感谢您的任何建议。


答案 1

我认为你在番石榴中寻找的是双打.


答案 2

您可以考虑使用 Trove,它提供对基元集合的支持,例如 TDoubleArrayList 类:

可调整大小、数组支持的双基元列表。

编辑:确实,这个类没有实现,但这是Java避免盒装原语的代价。番石榴的解决方案是最通用的,而Trove是更极端性能要求的最佳选择。List


推荐