Использование небольших (1–10 элементов) коллекций уровня экземпляра в Java

StackOverflow https://stackoverflow.com/questions/57145

  •  09-06-2019
  •  | 
  •  

Вопрос

Создавая классы на Java, я часто создаю коллекции на уровне экземпляров, которые, как я заранее знаю, будут очень маленькими — менее 10 элементов в коллекции.Но я не знаю заранее количество элементов, поэтому обычно выбираю динамическую коллекцию (ArrayList, Vector и т. д.).

class Foo
{
  ArrayList<Bar> bars = new ArrayList<Bar>(10);
}

Часть меня продолжает ворчать на то, что расточительно использовать сложные динамические коллекции для чего-то такого маленького размера.Есть ли лучший способ реализовать что-то подобное?Или это норма?

Обратите внимание: меня не беспокоят какие-либо (заметные) потери производительности или что-то в этом роде.Это просто мне интересно, нет ли лучшего способа сделать что-то.

Это было полезно?

Решение

А ArrayList класс в Java имеет только два элемента данных: ссылку на Object[] массив и размер, которые вам в любом случае понадобятся, если вы не используете ArrayList.Таким образом, единственное преимущество отказа от использования ArrayList сохраняет одно распределение объектов, что вряд ли когда-либо будет иметь большое значение.

Если вы создаете и удаляете множество экземпляров своего класса-контейнера (и, соответственно, вашего ArrayList экземпляр) каждую секунду вы мощь есть небольшая проблема с оттоком мусора, но об этом стоит беспокоиться, если это когда-либо произойдет.Сбор мусора обычно беспокоит вас меньше всего.

Другие советы

Для простоты я думаю, что это в значительной степени не проблема.Ваша реализация достаточно гибкая, и если требования изменятся в будущем, вам не придется проводить рефакторинг.Кроме того, добавление дополнительной логики в ваш код для гибридного решения просто не стоит того, учитывая ваш небольшой набор данных и высокое качество Java Collection API.

Коллекции Google имеет коллекции, оптимизированные для неизменяемых/небольшого количества элементов.Видеть Lists.asList API в качестве примера.

Накладные расходы очень малы.Можно написать список гибридного массива, в котором есть поля для первых нескольких элементов, а затем вернуться к использованию массива для более длинного списка.

Вы можете полностью избежать накладных расходов на объект списка, используя массив.Чтобы пойти еще дальше, вы можете объявить поле как Object и вообще отказаться от массива для одного элемента.

Если с памятью действительно проблемы, возможно, вам стоит забыть об использовании экземпляров объектов на низком уровне.Вместо этого используйте более крупную структуру данных с более высоким уровнем детализации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top