Эксперты по Java подчеркивают важность предотвращения преждевременной оптимизации и сосредоточения вместо этого на чистом объектно-ориентированном дизайне. Я пытаюсь согласовать этот принцип в контексте переписывания программы, использующей большой массив длинных элементов (несколько миллионов).Похоже, что использование ArrayList потребляет примерно в 3 раза больше памяти, чем примитивный массив длинных значений, и трата такого количества оперативной памяти кажется мне законной проблемой.
Я основываю это на эксперименте, который я провел с использованием класса 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 temp = new ArrayList(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
Мой вопрос: как я могу воспользоваться преимуществами объектно-ориентированного списка и при этом сохранить небольшой объем памяти, занимаемый примитивным массивом? Я думаю, что гуава может дать ответ, но, просматривая API, мне не очевидно, какой класс использовать вместо ArrayList.
Спасибо за любые предложения.