Использование небольших (1-10 элементов) коллекций на уровне экземпляра в Java - PullRequest
6 голосов
/ 11 сентября 2008

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 11 сентября 2008

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

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

3 голосов
/ 11 сентября 2008

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

2 голосов
/ 11 сентября 2008

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

1 голос
/ 11 сентября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...