Список , использующий ОЗУ типа double []?

Эксперты по 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.

Спасибо за любые предложения.

20
задан Jason Hall 21 December 2011 в 06:40
поделиться