Использование Java List, когда достаточно массива - PullRequest
3 голосов
/ 15 февраля 2011

Целесообразно ли использовать список коллекций Java в тех случаях, когда вы заранее знаете размер списка и можете также использовать массив там?Есть ли какие-либо недостатки в производительности?

Можно ли инициализировать список с элементами в одном операторе, например в массиве (список всех элементов, разделенных запятыми)?

Ответы [ 7 ]

4 голосов
/ 15 февраля 2011

Желательно ли использовать список коллекций Java в тех случаях, когда вы знаете размер списка заранее, и вы также можете использовать массив там?

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

На стороне профессионала:

  • Если вы используете List вместо массива, ваш код может использовать такие методы, как contains, insert, remove и т. Д.
  • Многие библиотечные классы ожидают коллекции-типизированные аргументы.
  • Вам не нужно беспокоиться о том, что для следующей версии кода next может потребоваться массив с более динамическими размерами ... что сделает первоначальный подход на основе массива ответственностью.

С другой стороны:

  • Коллекции немного медленнее , и более того, если базовый тип вашего массива является примитивным типом,
  • Коллекции do занимают больше памяти, особенно если базовый тип вашего массива является примитивным типом.

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

И на практике зачастую производительность и затраты/ или сложность кода, связанная с определением размера массива.(Рассмотрим гипотетический случай, когда вы использовали char[] для хранения конкатенации ряда. Вы можете определить, насколько большим должен быть массив; например, сложив размеры строк компонента. Но этогрязный!)

4 голосов
/ 15 февраля 2011

Коллекции / списки более гибкие и предоставляют больше полезных методов. В большинстве случаев любые потери производительности незначительны.

И для этой инициализации одного оператора используйте:

Arrays.asList(yourArray);

С Документы :

Возвращает список фиксированного размера, поддерживаемый указанным массивом. (Изменения в возвращаемом списке «сквозная запись» в массив.) Этот метод действует как мост между API на основе массива и на основе коллекции в сочетании с Collection.toArray. Возвращенный список является сериализуемым и реализует RandomAccess.

Я предполагаю, что это наиболее эффективный способ преобразования в список, но я могу ошибаться.

2 голосов
/ 15 февраля 2011

Существуют разные вещи: известен ли тип массива?Кто обращается к массиву?Есть несколько проблем с массивами, например:

  • вы не можете создавать универсальные массивы
  • массивы ковариантны: если A расширяет B -> A [] расширяет B [], что можетпривести к ArrayStoreExceptions
  • вы не можете сделать поля массива неизменными
  • ...

Также см. пункт 25 «Предпочитать списки массивам» вКнига Java.

Тем не менее, иногда удобны массивы, например, новый синтаксис параметра Object ...

Как можно инициализировать список с элементами в одном выражении, напримермассив = {список всех элементов, разделенных запятыми}?

Arrays.asList (): http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList%28T...%29

2 голосов
/ 15 февраля 2011

Да, это целесообразно.

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

2 голосов
/ 15 февраля 2011

1) a Collection является самым базовым типом и подразумевает только наличие коллекции объектов. Если нет порядка или дублирования, используйте java.util.Set, если возможно дублирование и используйте порядок java.util.List, есть ли порядок, но нет дублирования, используйте java.util.SortedSet

2) Кудрявые скобки для создания экземпляра Array, Arrays.asList () и универсальные шаблоны для вывода типа

List<String> myStrings = Arrays.asList(new String[]{"one", "two", "three"});

Есть также хитрость с использованием анонимных типов, но лично я не большой поклонник:

List<String> myStrings = new ArrayList<String>(){
// this is the inside of an anonymouse class
{
    // this is the inside of an instance block in the anonymous class
    this.add("one");
    this.add("two");
    this.add("three");
}};
2 голосов
/ 15 февраля 2011

Желательно ли использовать список коллекций Java в тех случаях, когда вы заранее знаете размер списка и можете также использовать массив там?Недостатки производительности ???

Если массива достаточно, используйте массив.Просто чтобы все было просто.Вы можете даже получить немного лучшую производительность.Имейте в виду, что если вам ...

  • когда-либо понадобится передать полученный массив в метод, который принимает Collection или
  • , если вам когда-либо понадобится работать с List -методы, такие как .contains, .lastIndexOf, или что нет, или
  • , если вам нужно использовать Collections методы, такие как reverse ...

тогда может с таким же успехом пойти на Collection / List классы с самого начала.

Как можно инициализировать список с элементами в одном операторе, таком как массив ={список всех элементов, разделенных запятыми}?

Вы можете сделать

List<String> list = Arrays.asList("foo", "bar");

или

List<String> arrayList = new ArrayList<String>(Arrays.asList("foo", "bar"));

или

List<String> list = new ArrayList<String>() {{ add("foo"); add("bar"); }};
1 голос
/ 15 февраля 2011

Желательно ли использовать список коллекций Java в тех случаях, когда вы знаете размер списка заранее, и вы также можете использовать массив там?Недостатки производительности?

Вполне допустимо использовать List вместо массива, даже если вы знаете размер заранее.

Как можно инициализировать список с элементами в одном операторе, таком как массив = {список всех элементов, разделенных запятыми}?

См. Arrays.asList().

...