Использование небольших (1–10 элементов) коллекций уровня экземпляра в Java
-
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 и вообще отказаться от массива для одного элемента.
Если с памятью действительно проблемы, возможно, вам стоит забыть об использовании экземпляров объектов на низком уровне.Вместо этого используйте более крупную структуру данных с более высоким уровнем детализации.