Зачем нужна коллекция рамок в Java? - PullRequest
6 голосов
/ 23 марта 2010

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

Может ли кто-нибудь указать мне пример, ориентированный на данные в реальном времени, который показывает разницу в обоих (массив / коллекции) этих реализаций.

Ответы [ 10 ]

26 голосов
/ 23 марта 2010
  • Массивы не могут быть изменены.
  • Java Collections Framework предоставляет множество различных полезных типов данных, таких как связанные списки (допускает вставку в любое место в постоянное время), изменяемые размеры списков массивов (например, Vector, но более холодные), красно-черные деревья, карты на основе хешей (например Hashtable но круче).
  • Java Collections Framework предоставляет абстракции, поэтому вы можете ссылаться на список как List независимо от того, поддерживается ли он списком массивов или связанным списком; и вы можете ссылаться на карту / словарь как Map независимо от того, поддерживается ли оно красно-черным деревом или хеш-таблицей.

Другими словами, Java Collections Framework позволяет использовать правильную структуру данных, потому что один размер не подходит для всех.

6 голосов
/ 23 марта 2010

Несколько причин:

  • Классы коллекции Java предоставляют интерфейс более высокого уровня, чем массивы.
  • Массивы имеют фиксированный размер. Коллекции (см. ArrayList) имеют гибкий размер.
  • Эффективная реализация сложных структур данных (например, хеш-таблиц) поверх необработанных массивов является сложной задачей. Стандартный HashMap дает вам это бесплатно.
  • Существуют различные реализации, которые вы можете выбрать для одного и того же набора служб: ArrayList против LinkedList, HashMap против TreeMap, синхронизированные и т. Д.
  • Наконец, массивы допускают ковариацию: установка элемента массива не гарантируется успешно из-за ошибок ввода, которые обнаруживаются только во время выполнения. Обобщения предотвращают эту проблему в массивах.

Взгляните на этот фрагмент, иллюстрирующий проблему ковариации:

  String[] strings = new String[10];
  Object[] objects = strings;

  objects[0] = new Date();  // <- ArrayStoreException: java.util.Date
2 голосов
/ 23 марта 2010

Классы коллекций, такие как реализации Set, List и Map, ближе к «проблемному пространству».Они позволяют разработчикам быстрее завершать работу и превращать их в более читаемый / поддерживаемый код.

1 голос
/ 23 марта 2010

Для каждого класса в API Коллекций есть разные ответы на ваш вопрос. Вот несколько примеров.

LinkedList: если вы удаляете элемент из середины массива, вы оплачиваете стоимость перемещения всех элементов справа от удаленного элемента. Не так со связанным списком.

Set: Если вы пытаетесь реализовать набор с массивом, добавление элемента или проверка наличия элемента - это O (N). С HashSet это O (1).

Карта: реализация карты с использованием массива даст те же характеристики производительности, что и ваша предполагаемая реализация массива набора.

0 голосов
/ 04 июня 2019

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

Например:

  • ArrayList - это как динамический массив, т. Е. Нам не нужно объявлять его размер, он увеличивается по мере добавления к нему элементов и уменьшается при удалении элементов из него во время выполнения программы.
  • LinkedList - может использоваться для изображения очереди (FIFO) или даже стека (LIFO).
  • HashSet - хранит свой элемент с помощью процесса, называемого хешированием. Порядок элементов в HashSet не гарантируется.
  • TreeSet - TreeSet - лучший кандидат, когда нужно хранить большое количество отсортированных элементов и их быстрый доступ.
  • ArrayDeque - Он также может использоваться для реализации очереди «первым пришел - первым вышел» (FIFO) или очереди «последний пришел - первым вышел» (LIFO).
  • HashMap - HashMap хранит данные в виде пар ключ-значение, где ключ и значение являются объектами.
  • Treemap - TreeMap хранит пары ключ-значение в отсортированном порядке возрастания, и скорость извлечения элемента из TreeMap достаточно высокая.

Чтобы узнать больше о коллекциях Java, прочитайте эту статью .

0 голосов
/ 18 сентября 2014

Коллекции Java придумали различную функциональность, удобство использования и удобство.

Когда в приложении мы хотим работать над группой объектов, только ARRAY не может нам помочь, а точнее ониможет привести к выполнению некоторых громоздких операций.

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

Коллекции придумали методы дляупростить нашу работу.

Каждый из них имеет уникальную особенность:

  • Список- По существу переменная-size array;
    Обычно вы можете добавлять / удалять элементы в любой произвольной позиции;
    Порядок элементов четко определен (т. е. вы можете сказать, какую позицию занимает данный элемент в списке).

    Используется - В большинстве случаев вам просто нужно сохранить или перебрать «кучу вещей», а затем перебрать их.

  • Set- Вещи cбыть "там или нет" - когда вы добавляете элементы в набор, нет понятия, сколько раз элемент был добавлен, и обычно нет понятия порядка.

    Используется- Запоминание«какие элементы вы уже обработали», например, при выполнении веб-сканирования;
    принятие других решений «да» или «нет» в отношении элемента, например «является ли элемент словом английского языка», «является ли элемент в базе данных?», "это товар в этой категории?"и т.д.

Здесь вы найдете использование каждой коллекции согласно сценарию:

0 голосов
/ 09 мая 2013

Коллекция - это фреймворк в Java, и вы знаете, что фреймворк очень прост в использовании, а не в реализации, и затем используйте его, и ваша проблема в том, что если мы не используем массив, у него есть недостатки, как у статического. определить размер строки, по крайней мере, в начале, поэтому, если ваш массив большой, то это приведет в основном к потере большой памяти. Таким образом, вы можете предпочесть ArrayList над ним, который находится внутри иерархии коллекции.

Сложность - другая проблема, например, вы хотите вставить ее в массив, после чего вам нужно проследить его до определения индекса, чтобы через него вы могли использовать LinkedList, все функции реализованы только в том случае, если вам нужно использовать, и ваш код стал менее сложным, и вы можете читать там Различные преимущества иерархии коллекций.

0 голосов
/ 23 марта 2010

Массивы не всегда эффективны. Что если вам нужно что-то вроде LinkedList? Похоже, вам нужно изучить некоторую структуру данных: http://en.wikipedia.org/wiki/List_of_data_structures

0 голосов
/ 23 марта 2010

Ну, основная предпосылка "неправильна", поскольку Java включала класс Dictionary, поскольку до этого в языке существовали интерфейсы ...

Коллекции

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

Да, можно получить те же функции, что и List и Set, с массивом, однако здесь много работы. Весь смысл библиотеки в том, что пользователям не нужно «накатывать» свои реализации общих вещей.

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

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

Если вы хотите иметь массив, который увеличивается со временем, вы, вероятно, не поместите код роста во все классы, а вместо этого напишите для этого один вспомогательный метод. То же самое для удаления и вставки и т.д ...

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

0 голосов
/ 23 марта 2010

Это зависит от потребностей вашего приложения. Существует так много типов коллекций, в том числе:

  • HashSet
  • ArrayList
  • HashMap
  • TreeSet
  • TreeMap
  • LinkedList

Так, например, если вам нужно хранить пары ключ / значение, вам придется написать много пользовательского кода, если он будет основан на массиве - тогда как коллекции Hash * должны просто работать из коробки. Как всегда, выберите подходящий инструмент для работы.

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