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则最适合更极端的性能要求。