Java: я должен всегда заменять Массивы для ArrayLists? - PullRequest
4 голосов
/ 17 июля 2010

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

В любом случае, есть ли какие-то рекомендации относительно того, когда использовать тот или иной?Например, я собираюсь вернуть таблицу из функции (int[][]), но мне было интересно, не лучше ли вернуть List<List<Integer>> или List<int[]>.

Ответы [ 5 ]

7 голосов
/ 17 июля 2010

Если у вас нет веской причины, в противном случае я бы рекомендовал использовать списки над массивами.

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

Где вы можетеЯ бы также рекомендовал программирование для абстракции (List), а не для конкретного типа (ArrayList).Опять же, это дает вам гибкость, если вы решите изменить детали реализации в будущем.

Для решения проблемы читабельности: если у вас сложная структура (например, ArrayList из HashMaps of ArrayLists), тогда рассмотрите возможность инкапсуляции этой сложности.внутри класса и / или создания некоторых очень четко названных функций для управления структурой.

3 голосов
/ 17 июля 2010

Выберите реализацию структуры данных и интерфейс на основе основного использования:

  • Произвольный доступ: используйте Список для типа переменной и ArrayList вкапот

  • Добавление: используйте Коллекция для переменного типа и LinkedList под капотом

  • Цикл и процесс: используйте Итерируемый и смотрите выше для использования под капотом на основе кода производителя

Используйте самый абстрактный интерфейс , когдапередача данных.Тем не менее, не используйте Коллекция , когда вам нужен произвольный доступ. Список имеет get (int) , что очень полезно при произвольном доступе.

Типизированные коллекции, такие как Список составляютсинтаксическое удобство массивов.

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

Вообще говоря, вам гораздо лучше использовать интерфейс , а не конкретный тип.Конкретный тип затрудняет переделку внутренних частей рассматриваемой функции.Например, если вы возвращаете int [] [], вы должны выполнить все вычисления заранее.Если вы вернете List>, вы можете лениво выполнять вычисления во время итерации (или даже одновременно в фоновом режиме), если это полезно.

1 голос
/ 17 июля 2010

Я хотел бы отметить, что списки могут содержать оболочки для примитивных типов данных, которые в противном случае должны были бы храниться в массиве.(т. е. класс Double, имеющий только одно поле: double). Более новые версии Java конвертируются в и из этих оболочек неявно, по крайней мере, большую часть времени, поэтому возможность помещать примитивы в свои списки не должна рассматриваться какПодавляющее большинство случаев использования.

Для полноты: единственный раз, когда я видел, что Java неявно не конвертировал из примитивной оболочки, это когда эти оболочки были составлены в структуре более высокого порядка: он не мог конвертировать Double [] в двойную [].

1 голос
/ 17 июля 2010

List более мощный:

  • Вы можете изменить размер списка после его создания.
  • Вы можете создать представление данных только для чтения.
  • Его можно легко комбинировать с другими коллекциями, такими как Set или Map.

Массив работает на более низком уровне:

  • Егосодержимое всегда можно изменить.
  • Его длина никогда не может быть изменена.
  • Используется меньше памяти.
  • У вас могут быть массивы примитивных типов данных.
0 голосов
/ 17 июля 2010

Это в основном сводится к гибкости / простоте использования и эффективности. Если вы не знаете, сколько элементов потребуется заранее, или если вам нужно вставить их посередине, ArrayLists - лучший выбор. Я полагаю, что они используют массивы под капотом, поэтому вы можете рассмотреть возможность использования метода ensureCapacity для повышения производительности. Массивы предпочтительнее, если у вас заранее установлен фиксированный размер, и вам не нужны вставки и т. Д.

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