Статьи

40 Java Коллекции Интервью Вопросы и ответы

Java Collections Framework является фундаментальным аспектом языка программирования Java. Это одна из важных тем для интервью на Java. Здесь я перечисляю некоторые важные вопросы и ответы для структуры коллекций Java .

  1. Что такое Java Collections Framework? Перечислите некоторые преимущества фреймворка Collections?
  2. В чем преимущество Generics in Collections Framework?
  3. Каковы основные интерфейсы Java Collections Framework?
  4. Почему Collection не расширяет интерфейсы Cloneable и Serializable?
  5. Почему интерфейс Map не расширяет интерфейс Collection?
  6. Что такое итератор?
  7. В чем разница между интерфейсом Enumeration и Iterator?
  8. Почему нет метода, подобного Iterator.add (), для добавления элементов в коллекцию?
  9. Почему у Iterator нет метода для получения следующего элемента напрямую, без перемещения курсора?
  10. Что отличается между Iterator и ListIterator?
  11. Каковы разные способы перебора списка?
  12. Что вы понимаете под свойством итератора fail-fast?
  13. В чем разница между отказоустойчивым и отказоустойчивым?
  14. Как избежать ConcurrentModificationException при повторении коллекции?
  15. Почему нет конкретных реализаций интерфейса Iterator?
  16. Что такое UnsupportedOperationException?
  17. Как работает HashMap в Java?
  18. Какое значение имеют методы hashCode () и equals ()?
  19. Можем ли мы использовать любой класс в качестве ключа карты?
  20. Какие разные виды коллекций предоставляются интерфейсом карты?
  21. В чем разница между HashMap и Hashtable?
  22. Как выбрать между HashMap и TreeMap?
  23. Каковы сходства и различия между ArrayList и Vector?
  24. В чем разница между Array и ArrayList? Когда вы будете использовать Array over ArrayList?
  25. В чем разница между ArrayList и LinkedList?
  26. Какие классы коллекции обеспечивают произвольный доступ к его элементам?
  27. Что такое EnumSet?
  28. Какие классы коллекции являются поточно-ориентированными?
  29. Что такое параллельные классы коллекции?
  30. Что такое BlockingQueue?
  31. Что такое Очередь и Стек, перечислите их различия?
  32. Что такое класс коллекций?
  33. Что такое интерфейс Comparable и Comparator?
  34. В чем разница между интерфейсом Comparable и Comparator?
  35. Как мы можем отсортировать список объектов?
  36. Передавая коллекцию в качестве аргумента функции, как мы можем быть уверены, что функция не сможет изменить ее?
  37. Как мы можем создать синхронизированную коллекцию из данной коллекции?
  38. Какие общие алгоритмы реализованы в Collections Framework?
  39. Что такое обозначение Big-O? Приведите несколько примеров?
  40. Каковы лучшие практики, связанные с Java Collections Framework?

Java Коллекции Интервью Вопросы Ответы

  1. Что такое Java Collections Framework? Перечислите некоторые преимущества фреймворка Collections?

    Коллекции используются на каждом языке программирования, и в первоначальном выпуске Java содержалось несколько классов для коллекций: Vector , Stack , Hashtable , Array . Но, глядя на более широкий охват и использование, Java 1.2 предложила Collections Framework, которая группирует все интерфейсы коллекций, реализации и алгоритмы. Коллекции Java прошли долгий путь с использованием классов Generics и Concurrent Collection для поточно-ориентированных операций. Он также включает блокирующие интерфейсы и их реализации в параллельном пакете Java. Некоторые из преимуществ коллекции коллекций:

    • Сокращение усилий по разработке благодаря использованию базовых классов коллекций, а не реализации наших собственных классов коллекций.
    • Качество кода улучшается за счет использования хорошо протестированных базовых классов коллекций.
    • Сокращение усилий по обслуживанию кода благодаря использованию классов коллекций, поставляемых с JDK.
    • Возможность повторного использования и совместимость
  2. В чем преимущество Generics in Collections Framework?

    Java 1.5 поставляется с Generics, и все интерфейсы и реализации коллекций активно ее используют. Обобщения позволяют нам предоставлять тип Object, который может содержать коллекция, поэтому, если вы попытаетесь добавить какой-либо элемент другого типа, он выдаст ошибку времени компиляции. Это исключает ClassCastException во время выполнения, потому что вы получите ошибку при компиляции. Также Generics делает код чистым, так как нам не нужно использовать операторы casting и instanceof. Это также добавляет преимущество во время выполнения, потому что инструкции байт-кода, которые делают проверку типа, не генерируются.

  3. Каковы основные интерфейсы Java Collections Framework?

    Коллекция является корнем иерархии коллекции. Коллекция представляет группу объектов, известных как ее элементы. Платформа Java не предоставляет никаких прямых реализаций этого интерфейса.

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

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

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

    Некоторые другие интерфейсы: Queue , Dequeue , Iterator , SortedSet , SortedMap и ListIterator .

  4. Почему Collection не расширяет интерфейсы Cloneable и Serializable?

    Интерфейс коллекции определяет группу объектов, известных как элементы. Как элементы поддерживаются, оставлено на усмотрение конкретных реализаций Collection. Например, некоторые реализации Collection, такие как List, допускают дублирование элементов, тогда как другие реализации, такие как Set, этого не делают. Многие реализации Collection имеют открытый метод клонирования. Однако не имеет смысла включать его во все реализации Collection. Это потому, что коллекция является абстрактным представлением. Важна реализация.
    Семантика и последствия клонирования или сериализации вступают в игру при работе с реальной реализацией; поэтому конкретная реализация должна решить, как ее следует клонировать или сериализовать, или даже можно ли ее клонировать или сериализовать.
    Таким образом, обязательное клонирование и сериализация во всех реализациях на самом деле менее гибкие и более строгие. Конкретная реализация должна принять решение относительно того, может ли она быть клонирована или сериализована.

  5. Почему интерфейс Map не расширяет интерфейс Collection?

    Хотя интерфейс Map и его реализации являются частью Collections Framework, Map не являются коллекциями, а коллекции не являются Map. Следовательно, для Map не имеет смысла расширять Collection или наоборот.
    Если Карта расширяет интерфейс Коллекции, то где эти элементы? Карта содержит пары ключ-значение и предоставляет методы для получения списка ключей или значений в виде коллекции, но она не вписывается в парадигму «группа элементов».

  6. Что такое итератор?

    Интерфейс Iterator предоставляет методы для перебора любой коллекции. Мы можем получить экземпляр итератора из коллекции, используя метод итератора. Итератор занимает место перечисления в платформе коллекций Java. Итераторы позволяют вызывающей стороне удалять элементы из базовой коллекции во время итерации.

  7. В чем разница между интерфейсом Enumeration и Iterator?

    Перечисление в два раза быстрее чем Iterator и использует очень меньше памяти. Перечень очень простой и соответствует основным потребностям. Но Iterator намного безопаснее по сравнению с Enumeration, потому что он всегда запрещает другим потокам изменять объект коллекции, который итерируется им.
    Итератор занимает место перечисления в платформе коллекций Java. Итераторы позволяют вызывающей стороне удалять элементы из базовой коллекции, что невозможно в Enumeration. Имена методов итератора были улучшены, чтобы сделать его функциональность понятной.

  8. Почему нет метода, подобного Iterator.add (), для добавления элементов в коллекцию?

    Семантика неясна, учитывая, что контракт для Iterator не дает никаких гарантий относительно порядка итерации. Обратите внимание, однако, что ListIterator предоставляет операцию добавления, поскольку он гарантирует порядок итерации.

  9. Почему у Iterator нет метода для получения следующего элемента напрямую, без перемещения курсора?

    Он может быть реализован поверх текущего интерфейса Iterator, но так как его использование будет редким, нет смысла включать его в интерфейс, который должен реализовать каждый.

  10. Что отличается между Iterator и ListIterator?

    • Мы можем использовать Iterator для обхода коллекций Set и List, тогда как ListIterator можно использовать только со списками.
    • Итератор может перемещаться только в прямом направлении, тогда как ListIterator может использоваться для перемещения в обоих направлениях.
    • ListIterator наследуется от интерфейса Iterator и поставляется с дополнительными функциями, такими как добавление элемента, замена элемента, получение позиции индекса для предыдущего и следующего элементов.
  11. Каковы разные способы перебора списка?

    Мы можем перебирать список двумя разными способами — используя итератор и используя цикл for-each.

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    List<String> strList = new ArrayList<>();
    //using for-each loop
    for(String obj : strList){
        System.out.println(obj);
    }
    //using iterator
    Iterator<String> it = strList.iterator();
    while(it.hasNext()){
        String obj = it.next();
        System.out.println(obj);
    }

    Использование итератора является более поточно-ориентированным, поскольку он гарантирует, что при изменении базовых элементов списка он вызовет исключение ConcurrentModificationException .

  12. Что вы понимаете под свойством итератора fail-fast?

    Свойство Iterator fail-fast проверяет любые изменения в структуре базовой коллекции каждый раз, когда мы пытаемся получить следующий элемент. Если найдены какие-либо изменения, выдается ConcurrentModificationException . Все реализации Iterator в классах Collection являются отказоустойчивыми по своей конструкции, за исключением параллельных классов коллекции, таких как ConcurrentHashMap и CopyOnWriteArrayList.

  13. В чем разница между отказоустойчивым и отказоустойчивым?

    Отказоустойчивое свойство Iterator работает с клоном базовой коллекции, поэтому на него не влияют какие-либо изменения в коллекции. По своей природе все классы коллекций в пакете java.util отказоустойчивы, тогда как классы коллекций в java.util.concurrent отказоустойчивы. Отказоустойчивые итераторы генерируют исключение ConcurrentModificationException, тогда как отказоустойчивый итератор никогда не генерирует исключение ConcurrentModificationException. Проверьте этот пост на CopyOnWriteArrayList Пример .

  14. Как избежать ConcurrentModificationException при повторении коллекции?

    Мы можем использовать классы одновременной коллекции, чтобы избежать исключения ConcurrentModificationException при выполнении итерации по коллекции, например, CopyOnWriteArrayList вместо ArrayList.
    Проверьте этот пост на
    ConcurrentHashMap Пример .

  15. Почему нет конкретных реализаций интерфейса Iterator?

    Интерфейс итератора объявляет методы для итерации коллекции, но за ее реализацию отвечают классы реализации коллекции. Каждый класс коллекции, который возвращает итератор для обхода, имеет свой собственный вложенный класс реализации итератора.
    Это позволяет классам коллекции выбирать, является ли итератор отказоустойчивым или отказоустойчивым. Например, итератор ArrayList является отказоустойчивым, тогда как итератор CopyOnWriteArrayList является отказоустойчивым.

  16. Что такое UnsupportedOperationException?

    UnsupportedOperationException — исключение, используемое, чтобы указать, что операция не поддерживается. Он широко используется в классах JDK, в структуре коллекций java.util.Collections.UnmodifiableCollection выбрасывает это исключение для всех операций add и remove .

  17. Как работает HashMap в Java?

    HashMap хранит пару ключ-значение в Map.Entry статического вложенного класса Map.Entry . HashMap работает над алгоритмом хеширования и использует методы hashCode () и equals () в методах put и get Когда мы вызываем метод put , передавая пару ключ-значение, HashMap использует hashCode () Key с хэшированием, чтобы найти индекс для хранения ключа пара значений Запись хранится в LinkedList, поэтому, если запись уже существует, она использует метод equals (), чтобы проверить, существует ли переданный ключ, если да, перезаписывает значение, иначе создает новую запись и сохраняет эту запись значения ключа. . Когда мы вызываем метод get , передавая Key, он снова использует hashCode (), чтобы найти индекс в массиве, а затем использует метод equals (), чтобы найти правильный Entry и вернуть его значение. Ниже изображение объяснит эти детали ясно.

    Java-HashMap ввода-продавца

    Другие важные вещи, которые нужно знать о HashMap — это емкость, коэффициент загрузки, изменение пороговых значений. Первоначальная емкость HashMap по умолчанию составляет 32, а коэффициент загрузки — 0,75. Порог — это емкость, умноженная на коэффициент загрузки, и всякий раз, когда мы пытаемся добавить запись, если размер карты превышает пороговое значение, HashMap переписывает содержимое карты в новый массив с большей емкостью. Емкость всегда равна 2, поэтому, если вы знаете, что вам нужно хранить большое количество пар ключ-значение, например, при кэшировании данных из базы данных, рекомендуется инициализировать HashMap с правильной емкостью и коэффициентом загрузки.

  18. Какое значение имеют методы hashCode () и equals ()?

    HashMap использует объект-объект hashCode () и метод equals () для определения индекса для размещения пары ключ-значение. Эти методы также используются, когда мы пытаемся получить значение из HashMap. Если эти методы не реализованы правильно, два разных ключа могут выдавать один и тот же результат hashCode () и equals (), и в этом случае вместо того, чтобы хранить его в другом месте, HashMap будет считать их одинаковыми и перезаписать их. Аналогично, все классы коллекции, которые не Для хранения дубликатов данных не нужно использовать hashCode () и equals () для поиска дубликатов, поэтому очень важно правильно их реализовать. Реализация equals () и hashCode () должна следовать этим правилам.

    • Если o1.equals(o2) , то o1.hashCode() == o2.hashCode() всегда должно быть true .
    • Если o1.hashCode() == o2.hashCode имеет значение true, это не значит, что o1.equals(o2) будет иметь значение true .
  19. Можем ли мы использовать любой класс в качестве ключа карты? В качестве ключа карты мы можем использовать любой класс, однако перед их использованием следует учитывать следующие моменты.
    • Если класс переопределяет метод equals (), он также должен переопределить метод hashCode ().
    • Класс должен следовать правилам, связанным с equals () и hashCode () для всех экземпляров. Пожалуйста, обратитесь ранее вопрос для этих правил.
    • Если поле класса не используется в equals (), вы не должны использовать его в методе hashCode ().
    • Лучшая практика для определяемого пользователем ключевого класса — сделать его неизменным, чтобы значение hashCode () могло быть кэшировано для быстрой производительности. Также неизменяемые классы гарантируют, что hashCode () и equals () не изменятся в будущем, что решит любую проблему с изменчивостью.
      Например, допустим, у меня есть класс MyKey который я использую для ключа HashMap.

      01
      02
      03
      04
      05
      06
      07
      08
      09
      10
      11
      12
      //MyKey name argument passed is used for equals() and hashCode()
      MyKey key = new MyKey('Pankaj'); //assume hashCode=1234
      myHashMap.put(key, 'Value');
       
      // Below code will change the key hashCode() and equals()
      // but it's location is not changed.
      key.setName('Amit'); //assume new hashCode=7890
       
      //below will return null, because HashMap will try to look for key
      //in the same index as it was stored but since key is mutated,
      //there will be no match and it will return null.
      myHashMap.get(new MyKey('Pankaj'));

      Это причина, почему String и Integer в основном используются в качестве ключей HashMap.

  20. Какие разные виды коллекций предоставляются интерфейсом карты?

    Интерфейс карты предоставляет три вида коллекций:

    • Set keySet (): возвращает представление Set ключей, содержащихся в этой карте. Набор опирается на карту, поэтому изменения в карте отражаются в наборе, и наоборот. Если карта изменяется во время выполнения итерации по набору (кроме как через собственную операцию удаления итератора), результаты итерации не определены. Набор поддерживает удаление элементов, которое удаляет соответствующее отображение с карты с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Он не поддерживает операции add или addAll.
    • Collection values ​​(): возвращает коллекционное представление значений, содержащихся в этой карте. Коллекция поддерживается картой, поэтому изменения в карте отражаются в коллекции, и наоборот. Если карта изменяется во время выполнения итерации по коллекции (кроме как через собственную операцию удаления итератора), результаты итерации не определены. Коллекция поддерживает удаление элементов, которое удаляет соответствующее отображение с карты с помощью операций Iterator.remove, Collection.remove, removeAll, retainAll и clear. Он не поддерживает операции add или addAll.
    • Set <Map.Entry <K, V >> entrySet () : Возвращает представление Set отображений, содержащихся в этой карте. Набор опирается на карту, поэтому изменения в карте отражаются в наборе, и наоборот. Если карта изменяется во время выполнения итерации по набору (кроме как через собственную операцию удаления итератора или через операцию setValue для записи карты, возвращаемой итератором), результаты итерации не определены. Набор поддерживает удаление элементов, которое удаляет соответствующее отображение с карты с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Он не поддерживает операции add или addAll.
  21. В чем разница между HashMap и Hashtable?

    HashMap и Hashtable оба реализуют интерфейс Map и выглядят одинаково, однако между HashMap и Hashtable есть следующие различия.

    • HashMap допускает нулевой ключ и значения, тогда как Hashtable не допускает нулевой ключ и значения.
    • Hashtable синхронизируется, но HashMap не синхронизируется. Таким образом, HashMap лучше подходит для однопоточной среды, Hashtable подходит для многопоточной среды.
    • LinkedHashMap был представлен в Java 1.4 как подкласс HashMap, поэтому, если вам нужен порядок итераций, вы можете легко переключаться с HashMap на LinkedHashMap, но это не так в случае с Hashtable, порядок итераций которого непредсказуем.
    • HashMap предоставляет набор ключей для итерации и, следовательно, работает быстро, но Hashtable предоставляет перечисление ключей, которые не поддерживают эту функцию.
    • Hashtable считается устаревшим классом, и если вы ищете модификации Map во время итерации, вы должны использовать ConcurrentHashMap.
  22. Как выбрать между HashMap и TreeMap?

    Для вставки, удаления и размещения элементов на карте HashMap предлагает лучшую альтернативу. Однако, если вам нужно пройти ключи в отсортированном порядке, то TreeMap — ваша лучшая альтернатива. В зависимости от размера вашей коллекции может быть быстрее добавить элементы в HashMap, а затем преобразовать карту в TreeMap для сортированного обхода ключа.

  23. Каковы сходства и различия между ArrayList и Vector?

    ArrayList и Vector во многом похожи.

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

    Это различия между ArrayList и Vector.

    • Вектор синхронизирован, тогда как ArrayList не синхронизирован. Однако, если вы ищете модификацию списка во время итерации, вы должны использовать CopyOnWriteArrayList.
    • ArrayList быстрее, чем Vector, потому что он не имеет никаких издержек из-за синхронизации.
    • ArrayList более универсален, потому что мы можем легко получить из него синхронизированный список или список только для чтения, используя служебный класс Collections.
  24. В чем разница между Array и ArrayList? Когда вы будете использовать Array over ArrayList?

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

    • Если размер списка фиксирован и в основном используется для их хранения и прохождения.
    • Для списка примитивных типов данных, хотя Коллекции используют автобокс для уменьшения усилий при кодировании, но все же это замедляет их при работе с примитивными типами данных фиксированного размера.
    • Если вы работаете с фиксированной многомерной ситуацией, использовать [] [] гораздо проще, чем List <List <>>
  25. В чем разница между ArrayList и LinkedList?

    ArrayList и LinkedList реализуют интерфейс List, но между ними есть некоторые различия.

    • ArrayList — это структура данных на основе индекса, поддерживаемая Array, поэтому он обеспечивает произвольный доступ к его элементам с производительностью как O (1), но LinkedList хранит данные в виде списка узлов, где каждый узел связан с его предыдущим и следующим узлом. Таким образом, даже несмотря на то, что есть метод для получения элемента с использованием индекса, он внутренне перемещается от начала к достижению в узле индекса, а затем возвращает элемент, поэтому производительность O (n) ниже, чем ArrayList.
    • Вставка, добавление или удаление элемента происходит быстрее в LinkedList по сравнению с ArrayList, поскольку отсутствует концепция изменения размера массива или обновления индекса, когда элемент добавляется в середине.
    • LinkedList использует больше памяти, чем ArrayList, потому что каждый узел в LinkedList хранит ссылку на предыдущий и следующий элементы.
  26. Какие классы коллекции обеспечивают произвольный доступ к его элементам?

    Классы ArrayList, HashMap, TreeMap, Hashtable обеспечивают произвольный доступ к его элементам. Загрузите java collection pdf для получения дополнительной информации.

  27. Что такое EnumSet?

    java.util.EnumSet — установка Set для использования с типами enum. Все элементы в наборе перечислений должны происходить из одного типа перечисления, который указывается, явно или неявно, при создании набора. EnumSet не синхронизирован и нулевые элементы не допускаются. Он также предоставляет некоторые полезные методы, такие как copyOf (Collection c), of (E first, E… rest) иplementOf (EnumSet s). Проверьте этот пост для учебника по java enum .

  28. Какие классы коллекции являются поточно-ориентированными?

    Vector, Hashtable, Properties и Stack являются синхронизированными классами, поэтому они являются поточно-ориентированными и могут использоваться в многопоточной среде. Java 1.5 Concurrent API включал некоторые классы коллекции, которые позволяют модифицировать коллекцию во время итерации, поскольку они работают с клоном коллекции, поэтому их можно безопасно использовать в многопоточной среде.

  29. Что такое параллельные классы коллекции?

    Пакет Java 1.5 Concurrent ( java.util.concurrent ) содержит поточно-ориентированные классы коллекций, которые позволяют изменять коллекции во время итерации. По замыслу итератор работает быстро и генерирует исключение ConcurrentModificationException. Некоторыми из этих классов являются CopyOnWriteArrayList , ConcurrentHashMap , CopyOnWriteArraySet Прочтите эти посты, чтобы узнать о них более подробно.

  30. Что такое BlockingQueue?

    java.util.concurrent.BlockingQueue — это очередь, которая поддерживает операции, которые ожидают, пока очередь не станет пустой, при извлечении и удалении элемента, и ожидают, пока пространство не станет доступным в очереди при добавлении элемента. Интерфейс BlockingQueue является частью фреймворк Java-коллекций, и он в основном используется для реализации проблем производителей. Нам не нужно беспокоиться об ожидании доступности пространства для производителя или объекта, доступного для потребителя в BlockingQueue, поскольку он обрабатывается классами реализации BlockingQueue.Java предоставляет несколько реализаций BlockingQueue, таких как ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue и т. Д. ,
    Проверьте это сообщение для использования BlockingQueue для
    проблемы производителя-потребителя .

  31. Что такое Очередь и Стек, перечислите их различия?

    И Очередь, и Стек используются для хранения данных перед их обработкой. java.util.Queue — это интерфейс, классы реализации которого присутствуют в параллельном пакете java. Очередь позволяет получить элемент в порядке «первым пришел-первым вышел» (FIFO), но это не всегда так. Существует также интерфейс Deque, который позволяет извлекать элементы из обоих концов очереди.
    Стек аналогичен очереди, за исключением того, что он позволяет извлекать элементы в порядке «последний пришел — первый вышел» (LIFO).
    Stack — это класс, расширяющий Vector, тогда как Queue — это интерфейс.

  32. Что такое класс коллекций?

    java.util.Collections — это служебный класс, состоящий исключительно из статических методов, которые работают или возвращают коллекции. Он содержит полиморфные алгоритмы, которые работают с коллекциями, «обертки», которые возвращают новую коллекцию, подкрепленную указанной коллекцией, и некоторые другие шансы и концы. Этот класс содержит методы для алгоритмов платформы коллекции, таких как двоичный поиск, сортировка, перестановка, обратный и т. д.

  33. Что такое интерфейс Comparable и Comparator?

    Java предоставляет Comparable интерфейс, который должен быть реализован любым пользовательским классом, если мы хотим использовать методы сортировки Arrays или Collections. Сопоставимый интерфейс имеет метод CompareTo (T obj), который используется методами сортировки. Мы должны переопределить этот метод таким образом, чтобы он возвращал отрицательное целое число, ноль или положительное целое число, если объект «this» меньше, равен или больше объекта, переданного в качестве аргумента. Но в большинстве сценариев реальной жизни Мы хотим сортировать по разным параметрам. Например, как генеральный директор, я хотел бы сортировать сотрудников по зарплате, а HR хотел бы сортировать их по возрасту. Это ситуация, когда нам нужно использовать интерфейс Comparator потому что реализация метода Comparable.compareTo(Object o) может сортировать только по одному полю, и мы не можем выбрать поле, по которому хотим отсортировать интерфейс Object.Comparator. compare(Object o1, Object o2) должен быть реализован метод, который принимает два аргумента Object, он должен быть реализован таким образом, чтобы он возвращал отрицательное значение int, если первый аргумент меньше второго, и возвращает ноль, если они равны, и положительное значение int, если первое. аргумент больше, чем второй.

    Проверьте этот пост на использование Comparable и Comparator интерфейс для сортировки объектов .

  34. В чем разница между интерфейсом Comparable и Comparator?

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

  35. Как мы можем отсортировать список объектов?

    Если нам нужно отсортировать массив объектов, мы можем использовать Arrays.sort() . Если нам нужно отсортировать список объектов, мы можем использовать Collections.sort() . Оба эти класса имеют перегруженные методы sort () для естественной сортировки (используя Comparable) или сортировки по критериям (используя Comparator). Внутри коллекций используется метод сортировки массивов, поэтому они оба имеют одинаковую производительность, за исключением того, что для преобразования списка в массив требуется некоторое время.

  36. Передавая коллекцию в качестве аргумента функции, как мы можем быть уверены, что функция не сможет изменить ее?

    Мы можем создать коллекцию только для чтения, используя метод Collections.unmodifiableCollection(Collection c) перед тем как передать ее в качестве аргумента, это гарантирует, что любая операция по изменению коллекции вызовет исключение UnsupportedOperationException .

  37. Как мы можем создать синхронизированную коллекцию из данной коллекции?

    Мы можем использовать Collections.synchronizedCollection(Collection c) чтобы получить синхронизированную (потокобезопасную) коллекцию, подкрепленную указанной коллекцией.

  38. Какие общие алгоритмы реализованы в Collections Framework?

    Java Collections Framework предоставляет реализации алгоритмов, которые обычно используются, такие как сортировка и поиск. Класс коллекций содержит эти реализации методов. Большинство из этих алгоритмов работают в List, но некоторые из них применимы для всех видов коллекций. Некоторые из них — сортировка, поиск, перемешивание, минимальные и максимальные значения.

  39. Что такое обозначение Big-O? Приведите несколько примеров?

    Обозначение Big-O описывает производительность алгоритма с точки зрения количества элементов в структуре данных. Поскольку классы Collection на самом деле являются структурами данных, мы обычно склонны использовать нотацию Big-O, чтобы выбрать реализацию коллекции для использования на основе времени, памяти и производительности. Пример 1: ArrayList get(index i) является операцией постоянного времени и не выполняет зависит от количества элементов в списке. Так что производительность в нотации Big-O равна O (1).
    Пример 2: Линейный поиск по производительности массива или списка — O (n), потому что нам нужно искать по всему списку элементов, чтобы найти элемент.

  40. Каковы лучшие практики, связанные с Java Collections Framework?

    • Выбирая правильный тип коллекции в зависимости от необходимости, например, если размер фиксирован, мы можем захотеть использовать Array поверх ArrayList. Если нам нужно перебрать карту в порядке вставки, нам нужно использовать TreeMap. Если мы не хотим дубликатов, мы должны использовать Set.
    • Некоторые классы коллекции позволяют указывать начальную емкость, поэтому, если у нас есть оценка количества элементов, которые мы будем хранить, мы можем использовать ее, чтобы избежать перефразирования или изменения размера.
    • Написание программы с точки зрения интерфейсов, а не реализаций, это позволяет нам легко изменить реализацию в более поздний момент времени.
    • Всегда используйте Generics для безопасности типов и избегайте ClassCastException во время выполнения.
    • Используйте неизменяемые классы, предоставляемые JDK, в качестве ключа в Map, чтобы избежать реализации hashCode () и equals () для нашего пользовательского класса.
    • Используйте максимально полезный класс Collections для алгоритмов или для получения коллекций только для чтения, синхронизированных или пустых, а не для написания собственной реализации. Это улучшит повторное использование кода с большей стабильностью и низкой ремонтопригодностью.

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

Ссылка: 40 вопросов о коллекциях Java и ответы от нашего партнера по JCG Панкаджа Кумара в блоге Developer Recipes .