ArrayList <Integer>против ArrayList <String>- оба хранят значения от 0 до 9, что занимает больше памяти? - PullRequest
0 голосов
/ 29 апреля 2018

Мне задали этот вопрос ... ArrayList из Integer против ArrayList из String - оба значения хранятся от 0 до 9 ... что занимает больше памяти?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Вот результат теста с использованием этого инструмента , он показывает, что ArrayList<Integer> занимает меньше памяти:

public static void main(String[] args) {
    ArrayList<Integer> integerArrayList = new ArrayList<>();
    ArrayList<String> stringArrayList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        integerArrayList.add(i);
        stringArrayList.add(String.valueOf(i));
    }
    System.out.println(RamUsageEstimator.sizeOf(integerArrayList));  // 240
    System.out.println(RamUsageEstimator.sizeOf(stringArrayList));  // 560
}
0 голосов
/ 29 апреля 2018

Предполагается, что списки создаются следующим образом:

    List<Integer> integers = new ArrayList<>();
    integers.add(0);
    integers.add(1);
    // ...
    List<String> strings = new ArrayList<>();
    strings.add("0");
    strings.add("1");
    // ...

Есть два уровня ответа на этот вопрос.

Во-первых, нужно знать потребление памяти Integer и String.

Итак, String с одним символом занимает 40 байтов (32 в Java 8). Integer занимает 16 байтов.

На этом уровне список строк занимает больше памяти, чем список целых чисел.

На втором уровне вы должны знать, что строковые литералы интернированы, и для бокса int с Integer.valueOf используется кэш для значений между -128 и, по крайней мере, 127. Так что в основном add("0") и add(0) будут использовать кэшированные объекты, и можно сказать, что дополнительная память не используется.

Таким образом, в зависимости от того, рассматриваете ли вы пул строк / целочисленный кеш, ответ может быть либо «список строк занимает больше памяти», либо «оба списка занимают одинаковое количество памяти».

Если это вопрос интервью, вам, вероятно, следует дать оба ответа.

пс. Я лично не знал бы размер String или Integer вне головы, но предположил бы String, чтобы взять больше памяти.

...