Java专家强调避免过早优化的重要性,而应将重点放在干净的OO设计上。我试图在重写使用大量长元素(几百万个)的程序的背景下调和这一原则。似乎使用ArrayList会消耗原始long类型数组的大约3倍的内存,而浪费这么多的RAM对我来说似乎是一个合理的问题。

我将以我使用MemoryTestBench类described here进行的实验为基础。我的测试和输出如下:

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列表的好处并仍然保留原始数组的较小内存占用量?我认为 Guava 可能提供了答案,但是浏览一下API对我来说,使用哪个类代替ArrayList并不明显。

感谢您的任何建议。

最佳答案

您可能考虑使用Trove,它提供对原始集合的支持,例如 TDoubleArrayList 类:



编辑:确实,此类未实现List,但这是Java避免使用盒装基元的代价。 Guava's solution是用途最广的,而Trove则最适合更极端的性能要求。

10-05 23:00
查看更多