Автор оригинала: Pankaj Kumar.
Платформа коллекций Java является одним из основных API языка программирования java.
Это одна из важных тем для вопросов для интервью на java. Здесь я перечисляю некоторые важные вопросы и ответы для интервью с коллекциями java, которые помогут вам в интервью. Это напрямую вытекает из моего более чем 14-летнего опыта в программировании на Java.
Вопросы для интервью с коллекциями Java
- Каковы функции, связанные с коллекцией, в Java 8?
- Что такое платформа коллекций Java? Перечислите некоторые преимущества фреймворка коллекций?
- В чем преимущество дженериков в рамках коллекций?
- Каковы основные интерфейсы платформы Java Collections?
- Почему коллекция не расширяет клонируемые и сериализуемые интерфейсы?
- Почему интерфейс карты не расширяет интерфейс коллекции?
- Что такое итератор?
- В чем разница между перечислением и интерфейсом итератора?
- Почему нет такого метода, как Iterator.add (), для добавления элементов в коллекцию?
- Почему у итератора нет метода для прямого получения следующего элемента без перемещения курсора?
- В чем разница между итератором и ЛистЕратором?
- Каковы различные способы перебора списка?
- Что вы понимаете под свойством iterator fail-fast?
- В чем разница между быстрым и безопасным отказом?
- Как избежать исключения ConcurrentModificationException при повторении коллекции?
- Почему нет конкретных реализаций интерфейса итератора?
- Что такое исключение UnsupportedOperationException?
- Как работает HashMap в Java?
- В чем важность методов hashCode() и equals ()?
- Можем ли мы использовать любой класс в качестве ключа карты?
- Каковы различные представления коллекции, предоставляемые интерфейсом карты?
- В чем разница между HashMap и Hashtable?
- Как выбрать между хэш-картой и картой деревьев?
- В чем сходство и разница между ArrayList и Vector?
- В чем разница между массивом и ArrayList? Когда вы будете использовать массив поверх списка массивов?
- В чем разница между ArrayList и LinkedList?
- Какие классы коллекции обеспечивают произвольный доступ к ее элементам?
- Что такое EnumSet?
- Какие классы коллекций потокобезопасны?
- Что такое параллельные классы коллекций?
- Что такое блокирующая очередь?
- Что такое очередь и стек, перечислите их различия?
- Что такое Класс коллекций?
- Что такое интерфейс сравнения и компаратора?
- В чем разница между интерфейсом Comparable и Comparator?
- Как мы можем отсортировать список объектов?
- Передавая коллекцию в качестве аргумента функции, как мы можем быть уверены, что функция не сможет ее изменить?
- Как мы можем создать синхронизированную коллекцию из данной коллекции?
- Каковы общие алгоритмы, реализованные в рамках коллекций?
- Что такое обозначение Big-O? Приведите несколько примеров?
- Каковы рекомендации, связанные с платформой коллекций Java?
- Что такое очередь приоритетов Java?
- Почему мы не можем написать код в виде списка<Число> ArrayList<Целое число>();?
- Почему мы не можем создать универсальный массив? или напишите код в виде списка<Целое число>[] ArrayList<Целое число>[10];
Коллекции Java Вопросы и ответы для интервью
Каковы функции, связанные с коллекцией, в Java 8?
Java 8 внесла серьезные изменения в API сбора данных. Некоторые из изменений заключаются в:
- Java Stream API для классов коллекций для поддержки последовательной, а также параллельной обработки
- Итерируемый интерфейс расширен с помощью метода forEach() по умолчанию, который мы можем использовать для итерации по коллекции. Это очень полезно при использовании с лямбда-выражениями , потому что его потребителем аргументов является функциональный интерфейс .
- Различные улучшения API сбора данных, такие как
forEachRemaining(действие потребителя)метод вИтераторинтерфейс, СопоставлениеreplaceAll(),вычисление(),объединение()методы.
Что такое платформа коллекций Java? Перечислите некоторые преимущества фреймворка коллекций?
Коллекции используются на каждом языке программирования, и начальный выпуск java содержал несколько классов для коллекций: Вектор , Стек , Хэш-таблица , Массив . Но, глядя на более широкую область применения и использования, Java 1.2 разработала платформу коллекций, которая объединяет все интерфейсы коллекций, реализации и алгоритмы. Коллекции Java прошли долгий путь с использованием универсальных и параллельных классов коллекций для потокобезопасных операций. Он также включает в себя блокирующие интерфейсы и их реализации в параллельном пакете java. Некоторые из преимуществ платформы коллекций заключаются в следующем;
- Сокращение усилий по разработке за счет использования основных классов коллекций, а не реализации наших собственных классов коллекций.
- Качество кода повышается за счет использования хорошо протестированных классов фреймворка коллекций.
- Сокращение затрат на обслуживание кода за счет использования классов коллекций, поставляемых вместе с JDK.
- Возможность повторного использования и совместимость
В чем преимущество дженериков в рамках коллекций?
Java 1.5 поставляется с универсальными приложениями, и все интерфейсы и реализации коллекций активно его используют. Универсальные шаблоны позволяют нам указывать тип объекта, который может содержать коллекция, поэтому при попытке добавить любой элемент другого типа возникает ошибка времени компиляции. Это позволяет избежать исключения ClassCastException во время выполнения, потому что вы получите ошибку при компиляции. Кроме того, генераторы делают код чистым, так как нам не нужно использовать приведение и оператор instanceof . Я бы настоятельно рекомендовал пройти Общий учебник по Java , чтобы лучше понять универсальные методы.
Каковы основные интерфейсы платформы Java Collections?
Коллекция является корнем иерархии коллекций. Коллекция представляет собой группу объектов, известных как ее элементы. Платформа Java не предоставляет никаких прямых реализаций этого интерфейса.
Набор – это коллекция, которая не может содержать повторяющиеся элементы. Этот интерфейс моделирует абстракцию математических множеств и используется для представления множеств, таких как колода карт.
Список представляет собой упорядоченную коллекцию и может содержать повторяющиеся элементы. Вы можете получить доступ к любому элементу из его индекса. Список больше похож на массив с динамической длиной.
Карта – это объект, который сопоставляет ключи со значениями. Карта не может содержать дубликатов ключей: каждый ключ может сопоставляться не более чем с одним значением.
Некоторые другие интерфейсы:
Очередь,Удаление очереди,Итератор,Набор сортировки,Карта сортировкииСписок.Почему коллекция не расширяет клонируемые и сериализуемые интерфейсы?
Интерфейс коллекции определяет группу объектов, известных как элементы. То, как поддерживаются элементы, зависит от конкретных реализаций сбора. Например, некоторые реализации коллекции, такие как List, допускают дублирование элементов, в то время как другие реализации, такие как Set, этого не делают. Многие реализации коллекции имеют общедоступный метод клонирования. Однако нет смысла включать его во все реализации коллекции. Это происходит потому, что коллекция-это абстрактное представление. Что имеет значение, так это реализация. Семантика и последствия клонирования или сериализации вступают в игру при работе с фактической реализацией; поэтому конкретная реализация должна решить, как ее следует клонировать или сериализовать, или даже можно ли ее клонировать или сериализовать. Таким образом, обязательное клонирование и сериализация во всех реализациях менее гибки и более ограничительны. Конкретная реализация должна решить, может ли она быть клонирована или сериализована.
Почему интерфейс карты не расширяет интерфейс коллекции?
Хотя интерфейс карты и его реализации являются частью структуры коллекций, Карта не является коллекциями, а коллекции не являются картой. Следовательно, для Карты нет смысла расширять коллекцию или наоборот. Если карта расширяет интерфейс коллекции, то где находятся элементы? Карта содержит пары ключ-значение и предоставляет методы для извлечения списка ключей или значений в виде коллекции, но она не вписывается в парадигму “группы элементов”.
Что такое итератор?
Интерфейс итератора предоставляет методы для перебора любой коллекции. Мы можем получить экземпляр итератора из коллекции с помощью метода iterator () . Итератор занимает место перечисления в структуре коллекций Java. Итераторы позволяют вызывающему объекту удалять элементы из базовой коллекции во время итерации. Итератор коллекции Java предоставляет универсальный способ обхода элементов коллекции и реализует Шаблон проектирования итератора .
В чем разница между перечислением и интерфейсом итератора?
Перечисление выполняется в два раза быстрее, чем итератор, и использует очень мало памяти. Перечисление очень простое и соответствует основным потребностям. Но итератор намного безопаснее по сравнению с перечислением, потому что он всегда запрещает другим потокам изменять объект коллекции, который он повторяет. Итератор заменяет перечисление в структуре коллекций Java. Итераторы позволяют вызывающему объекту удалять элементы из базовой коллекции, что невозможно при перечислении. Имена методов итератора были улучшены, чтобы сделать его функциональность понятной.
Почему нет такого метода, как Iterator.add (), для добавления элементов в коллекцию?
Семантика неясна, учитывая, что контракт на итератор не дает никаких гарантий относительно порядка итерации. Однако обратите внимание, что ListIterator предоставляет дополнительную операцию, поскольку она гарантирует порядок итерации.
Почему у итератора нет метода для прямого получения следующего элемента без перемещения курсора?
Он может быть реализован поверх текущего интерфейса итератора, но, поскольку его использование будет редким, нет смысла включать его в интерфейс, который должен реализовать каждый.
В чем разница между итератором и ЛистЕратором?
- Мы можем использовать итератор для обхода наборов и списков коллекций, в то время как ListIterator можно использовать только со списками.
- Итератор может перемещаться только в прямом направлении, тогда как листератор может использоваться для перемещения в обоих направлениях.
- ListIterator наследуется от интерфейса итератора и поставляется с дополнительными функциями, такими как добавление элемента, замена элемента, получение позиции индекса для предыдущих и следующих элементов.
Каковы различные способы перебора списка?
Мы можем перебирать список двумя различными способами – с помощью итератора и с помощью цикла для каждого.
Использование итератора более потокобезопасно, поскольку оно гарантирует, что при изменении базовых элементов списка оно вызовет исключение
ConcurrentModificationException.Что вы понимаете под свойством iterator fail-fast?
Итератор быстро проверяет свойство на наличие каких-либо изменений в структуре базовой коллекции каждый раз, когда мы пытаемся получить следующий элемент. Если будут обнаружены какие-либо изменения, это вызовет исключение
ConcurrentModificationException. Все реализации итератора в классах коллекций быстры по конструкции, за исключением параллельных классов коллекций, таких как ConcurrentHashMap и CopyOnWriteArrayList.В чем разница между быстрым и безопасным отказом?
Отказоустойчивое свойство итератора работает с клоном базовой коллекции, поэтому на него не влияют никакие изменения в коллекции. По замыслу, все классы коллекции в
java.utilпакете работают быстро, в то время как классы коллекции вjava.util.concurrentявляются отказоустойчивыми. Отказоустойчивые итераторы создают исключение ConcurrentModificationException, в то время как отказоустойчивый итератор никогда не создает исключение ConcurrentModificationException. Проверьте этот пост на Пример CopyOnWriteArrayList .Как избежать исключения ConcurrentModificationException при повторении коллекции?
Мы можем использовать параллельные классы коллекций, чтобы избежать
ConcurrentModificationExceptionпри повторении коллекции, например CopyOnWriteArrayList вместо ArrayList. Проверьте этот пост для Примера ConcurrentHashMap .Почему нет конкретных реализаций интерфейса итератора?
Интерфейс итератора объявляет методы для итерации коллекции, но за ее реализацию отвечают классы реализации коллекции. Каждый класс коллекции, возвращающий итератор для обхода, имеет свой собственный вложенный класс реализации итератора. Это позволяет классам коллекций выбирать, является ли итератор быстродействующим или отказоустойчивым. Например, итератор ArrayList работает быстро, в то время как итератор CopyOnWriteArrayList работает безотказно.
Что такое исключение UnsupportedOperationException?
Исключение UnsupportedOperationException– это исключение, используемое для указания на то, что операция не поддерживается. Он широко используется в классах JDK , в рамках коллекцийjava.util.Коллекции.UnmodifiableCollectionсоздает это исключение для всех операцийдобавленияиудаления.Как работает HashMap в Java?
HashMap хранит пару ключ-значение в
Map.Entryреализации статического вложенного класса. HashMap работает по алгоритму хеширования и использует методы hashCode() и equals() в методахputиget.Когда мы вызываем метод
put, передавая пару ключ-значение, HashMap использует хэш-код ключа() с хэшированием, чтобы узнать индекс для хранения пары ключ-значение. Запись хранится в списке ссылок, поэтому, если уже существует запись, она использует метод equals (), чтобы проверить, существует ли уже переданный ключ, если да, она перезаписывает значение, иначе она создает новую запись и сохраняет эту запись ключ-значение.Когда мы вызываем метод
get, передавая ключ, он снова использует хэш-код() для поиска индекса в массиве, а затем использует метод equals (), чтобы найти правильную запись и вернуть ее значение. На приведенном ниже изображении эти детали будут четко объяснены.Другие важные вещи, которые нужно знать о HashMap, – это емкость, коэффициент загрузки, изменение порогового значения. Начальная емкость хэш-карты по умолчанию составляет 16 а коэффициент нагрузки составляет 0,75. Пороговое значение-это емкость, умноженная на коэффициент загрузки, и всякий раз, когда мы пытаемся добавить запись, если размер карты превышает пороговое значение, HashMap преобразует содержимое карты в новый массив с большей емкостью. Емкость всегда равна 2, поэтому, если вы знаете, что вам нужно хранить большое количество пар ключ-значение, например, при кэшировании данных из базы данных, рекомендуется инициализировать хэш-карту с правильной емкостью и коэффициентом загрузки.
В чем важность методов hashCode() и equals ()?
HashMap использует хэш-код ключевого объекта() и метод equals() для определения индекса для размещения пары ключ-значение. Эти методы также используются, когда мы пытаемся получить значение из HashMap. Если эти методы реализованы неправильно, два разных ключа могут выдавать один и тот же хэш-код() и equals (), и в этом случае вместо того, чтобы хранить его в другом месте, HashMap рассмотрит то же самое и перезапишет их.
Аналогично, все классы коллекций, в которых не хранятся дубликаты данных, используют хэш-код() и equals() для поиска дубликатов, поэтому очень важно правильно их реализовать. Реализация equals() и hashCode() должна соответствовать этим правилам.
- Если
o1.равно(o2), тоo1.Хэш-код().Хэш-код()всегда должен бытьистинным. - Если
o1.hashCode().hashCodeистинно, это не означает, чтоo1.равно(o2)будетистинно.
- Если
Можем ли мы использовать любой класс в качестве ключа карты?
Мы можем использовать любой класс в качестве ключа карты, однако перед их использованием следует учитывать следующие моменты.
- Если класс переопределяет метод equals (), он также должен переопределять метод hashCode ().
- Класс должен следовать правилам, связанным с equals() и hashCode() для всех экземпляров. Пожалуйста, обратитесь к предыдущему вопросу об этих правилах.
- Если поле класса не используется в equals(), вы не должны использовать его в методе hashCode ().
Лучшая практика для определяемого пользователем класса ключей-сделать его неизменяемым, чтобы значение hashCode() можно было кэшировать для быстрой производительности. Также неизменяемые классы гарантируют, что hashCode() и equals() не изменятся в будущем, что решит любую проблему с изменяемостью. Например, допустим, у меня есть класс
MyKey, который я использую для ключа HashMap.Именно по этой причине строка и целое число в основном используются в качестве ключей хэш-карты.
Каковы различные представления коллекции, предоставляемые интерфейсом карты?
Интерфейс карты предоставляет три вида коллекций:
- Set keySet() : Возвращает представление набора ключей, содержащихся в этой карте. Набор поддерживается картой, поэтому изменения на карте отражаются в наборе, и наоборот. Если карта изменяется во время выполнения итерации по набору (за исключением операции удаления итератора), результаты итерации не определены. Набор поддерживает удаление элементов, которое удаляет соответствующее сопоставление с карты с помощью операций итератора remove, Set.remove, removeAll, retainAll и clear. Он не поддерживает операции добавления или добавления.
- Коллекция значений() : Возвращает представление коллекции значений, содержащихся на этой карте. Коллекция поддерживается картой, поэтому изменения на карте отражаются в коллекции, и наоборот. Если карта изменяется во время выполнения итерации над коллекцией (за исключением операции удаления итератора), результаты итерации не определены. Коллекция поддерживает удаление элементов, которое удаляет соответствующее сопоставление с карты с помощью операций итератора remove, Collection.remove, removeAll, retainAll и clear. Он не поддерживает операции добавления или добавления.
- Set V>> entrySet() : Возвращает заданное представление отображений, содержащихся на этой карте. Набор поддерживается картой, поэтому изменения на карте отражаются в наборе, и наоборот. Если карта изменяется во время выполнения итерации по набору (за исключением операции удаления итератора или операции setValue для записи карты, возвращаемой итератором) , результаты итерации не определены. Набор поддерживает удаление элементов, которое удаляет соответствующее сопоставление с карты с помощью операций итератора remove, Set.remove, removeAll, retainAll и clear. Он не поддерживает операции добавления или добавления. V>> entrySet()
: Возвращает заданное представление отображений, содержащихся на этой карте. Набор поддерживается картой, поэтому изменения на карте отражаются в наборе, и наоборот. Если карта изменяется во время выполнения итерации по набору (за исключением операции удаления итератора или операции setValue для записи карты, возвращаемой итератором) , результаты итерации не определены. Набор поддерживает удаление элементов, которое удаляет соответствующее сопоставление с карты с помощью операций итератора remove, Set.remove, removeAll, retainAll и clear. Он не поддерживает операции добавления или добавления.
В чем разница между HashMap и Hashtable?
- HashMap и Hashtable реализуют интерфейс карты и выглядят одинаково, однако между HashMap и Hashtable есть следующее различие.
- HashMap допускает нулевой ключ и значения, тогда как Hashtable не допускает нулевой ключ и значения.
Хэш-таблица синхронизирована, но хэш-карта не синхронизирована. Таким образом, HashMap лучше подходит для однопоточной среды, Hashtable подходит для многопоточной среды.LinkedHashMap- был представлен в Java 1.4 как подкласс HashMap, поэтому, если вам нужен порядок итераций, вы можете легко переключиться с HashMap на LinkedHashMap, но это не относится к хэш-таблице, порядок итераций которой непредсказуем.
- HashMap предоставляет набор ключей для итерации, и, следовательно, он работает быстро, но Hashtable предоставляет перечисление ключей, которые не поддерживают эту функцию.
Хэш-таблица считается устаревшим классом, и если вы ищете изменения карты во время итерации, вам следует использовать ConcurrentHashMap.
Как выбрать между хэш-картой и картой деревьев?
Для вставки, удаления и определения местоположения элементов на карте хэш-карта предлагает лучшую альтернативу. Однако, если вам нужно пройти по ключам в отсортированном порядке, то карта деревьев-ваша лучшая альтернатива. В зависимости от размера вашей коллекции может быть быстрее добавить элементы в хэш-карту, а затем преобразовать карту в древовидную карту для обхода отсортированных ключей.
В чем сходство и разница между ArrayList и Vector?
- ArrayList и Vector во многом похожи друг на друга.
- Оба они основаны на индексах и поддерживаются внутренним массивом.
- Оба поддерживают порядок вставки, и мы можем получить элементы в порядке вставки.
- Итераторные реализации ArrayList и Vector по своей конструкции быстры при отказе.
ArrayList и вектор допускают как нулевые значения, так и произвольный доступ к элементу с использованием номера индекса.
- Таковы различия между ArrayList и Vector.
- Вектор синхронизирован, тогда как ArrayList не синхронизирован. Однако, если вы хотите изменить список во время итерации, вам следует использовать CopyOnWriteArrayList.
- ArrayList работает быстрее, чем Vector, потому что у него нет никаких накладных расходов из-за синхронизации.
ArrayList более универсален, потому что мы можем легко получить из него список synchronizedlist или список, доступный только для чтения, с помощью служебного класса Collections.
В чем разница между массивом и ArrayList? Когда вы будете использовать массив поверх списка массивов? Массивы могут содержать примитивы или объекты, тогда как ArrayList может содержать только объекты. Массивы имеют фиксированный размер, в то время как размер списка массивов является динамическим.
Массивы не предоставляют много функций, таких как ArrayList, таких как addAll, removeAll, итератор и т. Д.
- Хотя ArrayList является очевидным выбором, когда мы работаем со списком, есть несколько случаев, когда массив хорошо использовать.
- Если размер списка фиксирован и в основном используется для их хранения и просмотра.
- Для списка примитивных типов данных, хотя коллекции используют автобоксы для уменьшения усилий по кодированию, но все же это замедляет их при работе с примитивными типами данных фиксированного размера.
Если вы работаете над фиксированной многомерной ситуацией, использовать [][] гораздо проще, чем Список<Список<>>
В чем разница между ArrayList и LinkedList?
- ArrayList и LinkedList реализуют интерфейс списка, но между ними есть некоторые различия.
- ArrayList-это структура данных на основе индекса, поддерживаемая массивом, поэтому она обеспечивает произвольный доступ к своим элементам с производительностью O(1), но LinkedList хранит данные в виде списка узлов, где каждый узел связан со своим предыдущим и следующим узлом. Таким образом, несмотря на то, что существует метод получения элемента с использованием индекса, внутренне он проходит путь от начала до узла индекса, а затем возвращает элемент, поэтому производительность O(n) ниже, чем у ArrayList.
- Вставка, добавление или удаление элемента в связанном списке выполняется быстрее по сравнению с ArrayList, поскольку отсутствует концепция изменения размера массива или обновления индекса при добавлении элемента в середине.
LinkedList потребляет больше памяти, чем ArrayList, потому что каждый узел в Связанном списке хранит ссылки на предыдущие и следующие элементы.
Какие классы коллекции обеспечивают произвольный доступ к ее элементам? Классы ArrayList, HashMap, TreeMap, Hashtable и Vector обеспечивают произвольный доступ к его элементам. Скачайте java collections pdf
для получения дополнительной информации.
Что такое EnumSet?java.util.EnumSet– это реализация набора для использования с типами перечислений. Все элементы в наборе перечислений должны принадлежать к одному типу перечисления, который явно или неявно указывается при создании набора. Набор перечислений не синхронизирован, и нулевые элементы не допускаются. Он также предоставляет некоторые полезные методы, такие как копирование(коллекция c), (E first, E… rest) и дополнение(перечисление s). Проверьте этот пост для учебника по перечислению java
.
Какие классы коллекций потокобезопасны?
Вектор, Хэш-таблица, Свойства и Стек являются синхронизированными классами, поэтому они потокобезопасны и могут использоваться в многопоточной среде. Параллельный API Java 1.5 включал некоторые классы коллекций, которые позволяют изменять коллекцию во время итерации, поскольку они работают с клоном коллекции, поэтому их безопасно использовать в многопоточной среде.
Что такое параллельные классы коллекций?
Параллельный пакет Java 1.5 (java.util.concurrent) содержит потокобезопасные классы коллекций, которые позволяют изменять коллекции во время итерации. По дизайну реализация итератора вjava.utilпакеты работают быстро и вызывают исключение ConcurrentModificationException. Но реализация итератора вjava.util.concurrentпакетах безопасна от сбоев, и мы можем изменять коллекцию во время итерации. Некоторые из этих классовCopyOnWriteArrayList,ConcurrentHashMap,CopyOnWriteArraySet.
- Прочитайте эти посты, чтобы узнать о них более подробно.
- Избегайте исключения ConcurrentModificationException
- Пример CopyOnWriteArrayList
HashMap против ConcurrentHashMap
Что такое блокирующая очередь?java.util.параллельный.BlockingQueue-это очередь, которая поддерживает операции, которые ожидают, пока очередь не станет пустой при извлечении и удалении элемента, и ждут, пока освободится место в очереди при добавлении элемента.
Интерфейс BlockingQueue является частью платформы java collections и в основном используется для реализации проблемы “производитель-потребитель”. Нам не нужно беспокоиться о том, чтобы ждать, пока освободится место для производителя или объект, доступный для потребителей в BlockingQueue, поскольку он обрабатывается классами реализации BlockingQueue. Java предоставляет несколько реализаций блокирующей очереди, таких как ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue и т. Д. Проверьте этот пост на предмет использования BlockingQueue для проблемы производитель-потребитель
.
Что такое очередь и стек, перечислите их различия?
Как очередь, так и стек используются для хранения данных перед их обработкой.java.util.Queue – это интерфейс, классы реализации которого присутствуют в параллельном пакете java. Очередь позволяет извлекать элемент в порядке поступления Первым (FIFO), но это не всегда так. Существует также интерфейс Deque, который позволяет извлекать элементы с обоих концов очереди. Стек похож на очередь, за исключением того, что он позволяет извлекать элементы в порядке “Последний вход-Первый выход” (LIFO).Стек-это класс, который расширяет вектор, тогда как очередь-это интерфейс.
Что такое Класс коллекций?java.util.Коллекции– это служебный класс, состоящий исключительно из статических методов, которые работают с коллекциями или возвращают их. Он содержит полиморфные алгоритмы, которые работают с коллекциями, “обертки”, которые возвращают новую коллекцию, подкрепленную указанной коллекцией, и несколько других мелочей.
Этот класс содержит методы для алгоритмов структуры сбора, такие как двоичный поиск, сортировка, перетасовка, реверс и т.д.
Что такое интерфейс сравнения и компаратора?
Java предоставляет сопоставимый интерфейс, который должен быть реализован любым пользовательским классом, если мы хотим использовать методы сортировки массивов или коллекций. Сопоставимый интерфейс имеет метод compareTo(T obj), который используется методами сортировки. Мы должны переопределить этот метод таким образом, чтобы он возвращал отрицательное целое число, ноль или положительное целое число, если “этот” объект меньше, равен или больше объекта, переданного в качестве аргумента.
Но в большинстве реальных сценариев нам нужна сортировка по различным параметрам. Например, как генеральный директор, я хотел бы сортировать сотрудников по заработной плате, отдел кадров хотел бы сортировать их по возрасту. Это ситуация, когда нам нужно использоватьКомпараторинтерфейс, потому чтоComparable.compareTo(объект o)реализация метода может сортировать только по одному полю, и мы не можем выбрать поле, по которому мы хотим сортировать объект.
Интерфейс компараторасравнение(объект o1, объект o2)необходимо реализовать метод, который принимает два аргумента объекта, он должен быть реализован таким образом, чтобы он возвращал отрицательное значение int, если первый аргумент меньше второго, и возвращал ноль, если они равны, и положительное значение int, если первый аргумент больше второго. Проверьте этот пост на предмет использования интерфейса сравнения и компаратора для сортировки объектов
.
В чем разница между интерфейсом Comparable и Comparator?
Интерфейсы сравнения и сравнения используются для сортировки коллекции или массива объектов. Сопоставимый интерфейс используется для обеспечения естественной сортировки объектов, и мы можем использовать его для обеспечения сортировки на основе единой логики.
Интерфейс компаратора используется для предоставления различных алгоритмов сортировки, и мы можем выбрать компаратор, который мы хотим использовать для сортировки данной коллекции объектов.
Как мы можем отсортировать список объектов?
Если нам нужно отсортировать массив объектов, мы можем использоватьArrays.sort(). Если нам нужно отсортировать список объектов, мы можем использоватьCollections.sort() . Оба этих класса имеют перегруженные методы сортировки() для естественной сортировки (с использованием сопоставимых) или сортировки на основе критериев (с использованием компаратора).Коллекции внутренне используют метод сортировки массивов, поэтому оба они имеют одинаковую производительность, за исключением того, что сборникам требуется некоторое время для преобразования списка в массив.
Передавая коллекцию в качестве аргумента функции, как мы можем быть уверены, что функция не сможет ее изменить?
Мы можем создать коллекцию только для чтения, используя методCollections.unmodifiableCollection(Коллекция c), прежде чем передавать ее в качестве аргумента, это гарантирует, что любая операция по изменению коллекции вызовет исключениеUnsupportedOperationException.
Как мы можем создать синхронизированную коллекцию из данной коллекции?
Мы можем использоватьКоллекции.synchronizedCollection(Коллекция c)для получения синхронизированной (потокобезопасной) коллекции, поддерживаемой указанной коллекцией.
Каковы общие алгоритмы, реализованные в рамках коллекций? Платформа коллекций Java предоставляет реализации алгоритмов, которые обычно используются, такие как сортировка и поиск. Класс коллекций содержит эти реализации методов. Большинство из этих алгоритмов работают со списком, но некоторые из них применимы для всех видов коллекций.
Некоторые из них сортируют, ищут, перетасовывают значения min-max.
Что такое обозначение Big-O? Приведите несколько примеров?
Обозначение Big-O описывает производительность алгоритма с точки зрения количества элементов в структуре данных. Поскольку классы коллекций являются структурами данных, мы обычно склонны использовать нотацию Big-O, чтобы выбрать реализацию коллекции для использования в зависимости от времени, памяти и производительности.
Пример 1: ArrayListget(индекс i) является операцией постоянного времени и не зависит от количества элементов в списке. Таким образом, его производительность в обозначении Big-O равна O(1).Пример 2: Линейный поиск по массиву или списку выполняется O(n), потому что нам нужно выполнить поиск по всему списку элементов, чтобы найти элемент.
- Каковы рекомендации, связанные с платформой коллекций Java?
- Выбирая правильный тип коллекции в зависимости от необходимости, например, если размер фиксирован, мы можем захотеть использовать массив вместо списка массивов. Если нам нужно выполнить итерацию по карте в порядке вставки, нам нужно использовать LinkedHashMap. Если нам не нужны дубликаты, мы должны использовать Set.
- Некоторые классы коллекций позволяют указать начальную емкость, поэтому, если у нас есть оценка количества элементов, которые мы будем хранить, мы можем использовать ее, чтобы избежать повторного переноса или изменения размера.
- Напишите программу с точки зрения интерфейсов, а не реализаций, это позволит нам легко изменить реализацию в более поздний момент времени.
- Всегда используйте универсальные шаблоны для обеспечения безопасности типов и избегайте исключения ClassCastException во время выполнения.
- Используйте неизменяемые классы, предоставляемые JDK в качестве ключа в Map, чтобы избежать реализации хэш-кода() и equals() для нашего пользовательского класса.
Используйте служебный класс Collections как можно больше для алгоритмов или для получения доступных только для чтения, синхронизированных или пустых коллекций, а не для написания собственной реализации. Это улучшит повторное использование кода с большей стабильностью и низкой ремонтопригодностью.
Что такое очередь приоритетов Java? Приоритетная очередь-это неограниченная очередь, основанная на куче приоритетов, и элементы упорядочены в их естественном порядке, или мы можем предоставить Компаратор для упорядочения во время создания. Очередь приоритетов не допускает нулевых значений, и мы не можем добавить какой-либо объект, который не обеспечивает естественный порядок, или у нас нет никакого компаратора для них для упорядочения. Приоритетная очередь Java не является потокобезопасной и предоставляет O(log(n)) время для операций постановки в очередь и удаления из очереди. Проверьте это сообщение для пример очереди приоритетов java
.
Почему мы не можем написать код в виде списка<Число> ArrayList<Целое число>();?
Дженерики не поддерживают подтипирование, потому что это вызовет проблемы с обеспечением безопасности типов. Вот почему List не рассматривается как подтип List, где S-супертип T. Чтобы понять, почему это запрещено, давайте посмотрим, что могло бы произойти, если бы это было поддержано.
Как вы можете видеть из приведенного выше кода, если бы дженерики поддерживали подтипирование, мы могли бы легко добавить двойника в список Long, что вызвало быClassCastExceptionво время выполнения при обходе списка Long.
Почему мы не можем создать универсальный массив? или напишите код в виде списка<Целое число>[] ArrayList<Целое число>[10];
Нам не разрешается создавать универсальные массивы, поскольку массив несет информацию о типе своих элементов во время выполнения. Эта информация используется во время выполнения для броскаИсключение ArrayStoreExceptionесли тип элементов не соответствует определенному типу. Поскольку информация о типе обобщений стирается во время компиляции путем стирания типов, проверка хранилища массивов была бы пройдена там, где она должна была завершиться неудачей. Давайте разберемся в этом с помощью простого примера кода.
Массивы ковариантны по своей природе, т. Е. S[] является подтипом T[] всякий раз, когда S является подтипом T, но универсальные типы не поддерживают ковариацию или подтипирование, как мы видели в последнем вопросе. Поэтому, если бы нам было разрешено создавать универсальные массивы, из-за стирания типов мы бы не получили исключение хранилища массивов, даже если оба типа не связаны. Чтобы узнать больше о дженериках, прочитайте Учебник по дженерикам Java
Я буду продолжать добавлять больше вопросов о фреймворке java collections, как и когда я их нашел, если вы нашли это полезным, пожалуйста, поделитесь им и с другими, это мотивирует меня писать больше подобных статей. 🙂
Пожалуйста, дайте мне знать, если я пропустил какой-либо важный вопрос, я включу его в список.