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