Когда ArrayList предпочтителен для массива в Java?

Некоторые хорошие ответы здесь о конкретном вопросе Вы спросили. Я хотел бы отступить и посмотреть на большее изображение.

Имеют в виду, что восприятие Вашим пользователем скорости программного обеспечения, которое Вы пишете, затронуто многими другими факторами, чем, как хорошо codegen оптимизирует. Вот некоторые примеры:

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

  • Мой C# легче считать & поймите, чем мой C++. У меня также есть больше способов убедить меня, что мой код C# работает правильно. Это означает, что я могу оптимизировать свои алгоритмы с меньшим количеством риска представления ошибок (и пользователям не нравится программное обеспечение, которое отказывает, даже если это делает это быстро!)

  • я могу создать свое программное обеспечение быстрее в C#, чем в C++. Это освобождает время, чтобы работать над производительностью и все еще поставить мое программное обеспечение вовремя.

  • легче записать хороший UI в C#, чем C++, таким образом, я, более вероятно, смогу продвинуть работу к фону, в то время как UI остается быстро реагирующим, или обеспечить прогресс или hearbeat UI, когда программа должна заблокироваться некоторое время. Это ничего не делает быстрее, но это делает пользователей более довольными ожиданием.

Все, что я сказал о C#, вероятно, верно для Java, у меня просто нет опыта сказать наверняка.

6
задан dfa 17 August 2009 в 20:55
поделиться

9 ответов

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

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

ArrayList также может быть предпочтительным, если вам нужно выполнять операции, доступные в его API, которые потребовали бы ручной реализации для массива. (например, indexOf)

synchronizedList и unmodifiableList )
  • объявив ArrayList как List , вы можете легко заменить реализацию на LinkedList когда ты нуждаешься; это imho является лучшим преимуществом перед простыми массивами
  • Array toString , equals и hashCode странно и подвержено ошибкам, вы должны использовать массивы служебные программы класса
  • 8
    ответ дан 8 December 2019 в 02:35
    поделиться

    ArrayLists полезны, когда вы не знаете заранее, сколько элементов вам понадобится. Простой пример: вы читаете текстовый файл и составляете список всех найденных слов. Вы можете просто продолжать добавлять в свой список массивов, он будет расти.

    Массивы, вам необходимо заранее объявить их размер.

    5
    ответ дан 8 December 2019 в 02:35
    поделиться

    Дело не только в том, что массивы нуждаются в чтобы расти, с коллекцией легче работать.

    Иногда с массивами можно справиться, когда вам просто нужно перебирать элементы в режиме только для чтения. Однако в большинстве случаев вы хотите использовать такие методы, как contains и т. Д.

    Вы не можете создавать универсальные массивы, поэтому ' может »или не может вас беспокоить.

    Если есть сомнения, используйте Коллекции, это заставит людей, которые используют ваш API, полюбить вас :-). Если вы предоставите им только массивы, первые строки кода, которые они напишут:

    Arrays.asList(thatGuyArray);
    
    4
    ответ дан 8 December 2019 в 02:35
    поделиться

    Интерфейс List, реализация которого ArrayList является реализацией в Java Collections Framework , намного богаче, чем то, что может предложить простой массив Java. Из-за относительно широко распространенной поддержки инфраструктуры коллекций в Java и сторонних библиотеках использование ArrayList вместо массива в целом имеет смысл. Я бы использовал массивы только в том случае, если они действительно нужны:

    • Они требуются для какого-то другого интерфейса, который я вызываю
    • Профилирование показывает узкое место в ситуации, когда доступ к массиву может дать значительное ускорение по сравнению с доступом к списку
    • Ситуации, когда массив кажется более естественным, например, буферы необработанных данных, как в

       byte [] buffer = new byte [0x400]; // выделяем буфер размером 1 Кбайт
      

    Вы всегда можете получить представление вашего ArrayList в виде массива, если он вам нужен:

    Foo[] bar = fooList.toArray(new Foo[fooList.size()])
    

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

    return Collections.unmodifiableList(privateListMember);
    

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

    Согласно комментарию Ника Холта, вы не должны раскрывать тот факт, что список является ArrayList где-либо:

    private List<Foo> fooList = new ArrayList<Foo>();
    
    public List<Foo> getFooList() {
        return Collections.unmodifiableList(fooList);
    }
    
    4
    ответ дан 8 December 2019 в 02:35
    поделиться

    Когда вы хотите изменить его размер, добавляя или удаляя элементы.

    Когда вы хотите передать его чему-то, кому требуется Коллекция или Итерация (хотя вы можете использовать Arrays.asList (a), чтобы массив a выглядел как список).

    2
    ответ дан 8 December 2019 в 02:35
    поделиться

    Я бы сказал, что по умолчанию предполагается, что используйте ArrayList, если у вас нет особой необходимости, просто потому, что он делает ваш код более гибким и менее подверженным ошибкам. Нет необходимости увеличивать размер объявления, когда вы добавляете дополнительный элемент на расстоянии 500 строк кода и т. Д. И ссылайтесь на интерфейс List, так что вы можете заменить список Array на LinkedList или CopyOnWriteArrayList или любую другую реализацию списка, которая может помочь в ситуации, без необходимости изменения большого количества кода.

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

    Массивы могут быть многомерными. ArrayLists не могут.

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

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

    Массивы могут быть многомерными. ArrayLists не могут.

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

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

    Массивы могут быть многомерными. ArrayLists не могут.

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

    2
    ответ дан 8 December 2019 в 02:35
    поделиться

    Еще пара моментов:

    • Вы можете рассмотреть возможность использования массива для представления более чем одного измерения (например, матрицы).
    • Можно использовать массивы для хранения примитивов и, следовательно, более компактного представления ваших данных, чем использование ArrayList.
    7
    ответ дан 8 December 2019 в 02:35
    поделиться

    Если у модели есть другие свойства, а не имя, вам необходимо инициализировать их исходным значением в базе данных, если они не будут установлены на null.

    Вы можете использовать операции обновления HQL ; Сам я никогда не пробовал.

    Вы также можете использовать собственный оператор SQL . (« Обновить имя набора моделей ... »).

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

    почему бы не использовать TabControl с UserControls внутри? Если вам нужно преобразовать одну из этих вкладок в плавающее окно, просто поместите UserControl в новое окно ...

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

    ArrayList также может быть предпочтительным, если вам нужно выполнять операции, доступные в его API, которые потребуется ручная реализация для массива. (например, indexOf)

    3
    ответ дан 8 December 2019 в 02:35
    поделиться

    Добрый день,

    Пара моментов, которые люди, кажется, упустили до сих пор.

    1. массив может содержать только один тип объекта, тогда как ArrayList - это контейнер, который может содержат смесь типов объектов, он неоднороден,
    2. массив должен объявлять тип своего содержимого при объявлении самого массива. ArrayList не должен объявлять тип своего содержимого, когда объявляется ArrayList,
    3. вы должны вставить элемент в определенное место в массиве. Добавление в ArrayList выполняется с помощью метода add () в контейнере, а
    4. объекты хранятся в массиве и сохраняют свой тип, поскольку в массиве могут храниться только объекты определенного типа. Объекты хранятся в ArrayList с помощью суперкласса типа Object.

    Edit: Ooop. Что касается последнего пункта в списке, Я забыл об особом случае, когда у вас есть массив объектов, тогда эти массивы также могут содержать любой тип объекта. Спасибо за комментарий, Ишай! (-:

    HTH

    ура,

    0
    ответ дан 8 December 2019 в 02:35
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: