JavaRush /Blog Java /Random-FR /Questions d'entretien fréquemment posées sur les classes ...
theGrass
Niveau 24
Саратов

Questions d'entretien fréquemment posées sur les classes de collection en Java (partie 2)

Publié dans le groupe Random-FR
Questions d'entretien fréquemment posées sur les classes de collection en Java (partie 2) - 1Questions sur les différences entre les différentes collections
  1. Quelles sont les différences entre Setet List?
  2. Quelles sont les différences entre Listet Map?
  3. Nommez les différences entre HashMapetHashTable?
  4. Quelles sont les différences entre Vectoret ArrayList?
  5. Quelles sont les différences entre Iteratoret Enumeration?
  6. Quelles sont les différences entre HashMapet HashSet?
  7. Quelles sont les différences entre Iteratoret ListIterator?
  8. Quelles sont les différences entre TreeSetet SortedSet?
  9. Quelles sont les différences entre ArrayListet LinkedList?
Et d'autres questions
  1. Comment rendre une collection en lecture seule ?
  2. Comment créer une collection thread-safe ?
  3. Pourquoi n’existe-t-il pas de méthode Iterator.add()pour ajouter des éléments à une collection ?
  4. Quels sont les moyens de parcourir les éléments d’une liste ?
  5. Comment comprenez-vous que la propriété iterator fonctionne fail-fast?
  6. Quelle est la différence entre fail-fastet fail-safe?
  7. Comment éviter ConcurrentModificationExceptionlors d’une itération dans une collection ?
  8. Ce qui s'est passé UnsupportedOperationException?
  9. Quelles classes de collection donnent accès à n’importe quel élément ?
  10. Ce qui s'est passé BlockingQueue?
  11. Qu'est-ce qu'une file d'attente et une pile, énumérez les différences entre elles ?
  12. Que sont les interfaces Comparableet Comparator?
  13. Que sont les cours Collectionset Arrays?
  14. Liste de la littérature utilisée
Sans perdre de temps, commençons par les explications.

Questions sur les différences entre les différentes collections

  1. Quelles sont les différences entre Setet List?

    Liste des principales différences :
    les ensembles sont des collections non ordonnées, tandis que les listes sont des collections ordonnées, où chaque élément a un index commençant à zéro. Les listes peuvent contenir deux éléments identiques ou plus, mais pas les ensembles. Une liste peut contenir n'importe quel nombre d'éléments null, mais un ensemble ne peut en contenir qu'un seul.

  2. Quelles sont les différences entre Listet Map?

    La question la plus simple. Une liste est une collection d’éléments et un dictionnaire est une collection de paires clé/valeur. Il y a bien d’autres changements, mais ils en sont tous une conséquence. Ils ont une interface de niveau supérieur différente, un ensemble de méthodes différent et des vues de données différentes. Dans la plupart des cas, seule la première réponse suffit.

  3. Quelles sont les différences entre HashMapet HashTable?

    Il existe plusieurs différences entre HashMapet HashTableen Java :

    • HashTablethread-safe, mais HashMappas
    • HashTablene peut pas contenir d'éléments null, alors qu'il HashMappeut contenir une clé nullet n'importe quel nombre de valeursnull
    • La troisième différence clé entre eux est que l'itérateur y HashMap, contrairement à l'énumérateur HashTable, fonctionne selon le principe fail-fast(lève une exception pour toute incohérence des données)

  4. Quelles sont les différences entre Vectoret ArrayList?

    Notons quelques différences :

    • Toutes les méthodes Vectorsont thread-safe, mais ArrayListpas
    • VectorIl s'agit d'une classe héritée ajoutée dans la première version du JDK. ArrayListest apparu dans le JDK 1.2, avec le reste des classes du frameworkCollection
    • Par défaut, Vectoril double sa taille lorsque la mémoire allouée aux éléments est épuisée. ArrayListil n'augmente sa taille que de moitié

  5. Quelles sont les différences entre Iteratoret Enumeration?

    Les itérateurs diffèrent des énumérateurs de trois manières :

    • Il existe des itérateurs qui vous permettent de supprimer des éléments de votre collection lors d'une itération, à l'aide du remove(). La classe Iteratorne prend pas en charge cette fonctionnalité. Vous ne pouvez pas ajouter/supprimer des éléments à l'aide d'un énumérateur
    • Les énumérateurs sont présents dans les classes héritées telles que Vector/Stack, tandis que les itérateurs sont présents dans toutes les classes de collections modernes
    • Une autre petite différence est que les itérateurs et les énumérateurs ont des noms de méthodes différents, c'est-à-dire Enumeration.hasMoreElements()matches Iterator.hasNext()et Enumeration.nextElement()matches Iterator.next(), etc.

  6. Quelles sont les différences entre HashMapet HashSet?

    HashMapest une collection de paires clé/valeur, alors qu'il HashSets'agit d'une collection ordonnée d'éléments uniques. Et c'est tout, aucune autre explication n'est nécessaire.

  7. Quelles sont les différences entre Iteratoret ListIterator?

    Il y a trois différences :

    • Iteratorpeut être utilisé pour parcourir les éléments de Set, Listet Map . En revanche, ListIteratoril ne peut être utilisé que pour parcourir les éléments d'une collection.List
    • Iteratorvous permet de parcourir les éléments dans une seule direction, en utilisant le next(). Alors ListIteratorqu'il vous permet de parcourir une liste dans les deux sens, en utilisant des méthodes next()etprevious()
    • Avec l'aide, ListIteratorvous pouvez modifier la liste en ajoutant/supprimant des éléments à l'aide des méthodes add()et remove(). Iteratorne prend pas en charge cette fonctionnalité

  8. Quelles sont les différences entre TreeSet et SortedSet ?

    SortedSetIl s'agit d'une interface implémentée par la classe TreeSet. C'est tout!

  9. Quelles sont les différences entre ArrayListet LinkedList?
    • LinkedListstocke les éléments dans une liste doublement chaînée, alors que ArrayListles stocke dans un tableau dont la taille peut changer dynamiquement
    • LinkedList поддерживает добавление/удаление элементов за фиксированное время, но только последовательный доступ к elementм. То есть, вы можете перебрать список с начала в конец и с конца в начало, но получение element в середине списка займет время пропорциональное размеру списка. ArrayList же позволяет получить любой элемент по его индексу за фиксированное время. Но добавление/удаление элементов туда требует затрат времени пропорциональных размеру, потому что нужно подвинуть все элементы с места вставки/удаления и до конца списка, либо чтобы освободить место для вставляемого либо чтобы убрать пропуск на месте удаленного
    • LinkedList требует больше памяти для хранения такого же количества элементов, потому что кроме самого element хранятся еще указатели на следующий и предыдущий элементы списка, тогда How в ArrayList элементы просто идут по порядку

И еще вопросы

  1. Как сделать коллекцию только для чтения?

    Используйте следующие методы:

    • Collections.unmodifiableList(list);
    • Collections.unmodifiableSet(set);
    • Collections.unmodifiableMap(map);

    Все они принимают коллекцию в качестве параметра, и возвращают коллекцию только для чтения с теми же elementми внутри.

  2. Как сделать потокобезопасную коллекцию?

    Используйте следующие методы:

    • Collections.synchronizedList(list);
    • Collections.synchronizedSet(set);
    • Collections.synchronizedMap(map);

    Все они принимают коллекцию в качестве параметра, и возвращают потокобезопасную коллекцию с теми же elementми внутри.

  3. Почему не существует метода Iterator.add() для добавления элементов в коллекцию?

    Единственная задача итератора это перебор коллекции. Каждая коллекция имеет метод add() которым вы можете воспользоваться. Нет смысла добавлять этот метод в итератор, потому что коллекции могут быть упорядоченными и неупорядоченными, и метод add() при этом должен быть устроен по разному.

  4. Какие существуют способы перебирать элементы списка?

    Есть 4 способа:

    • Цикл с итератором
    • Цикл for
    • Расширенный цикл for
    • Цикл while
    Читайте статью.

  5. Как вы понимаете работу свойства итератора fail-fast?

    Итератор fail-fast вызывает исключение сразу How обнаружит что структура коллекции была изменена после начала перебора. Под изменением структуры мы понимаем добавление/удаление/изменение element коллекции, в то время How другой поток перебирает эту коллекцию.

  6. Какая разница между fail-fast и fail-safe?

    В противоположность fail-fast, итераторы fail-safe не вызывают ниHowих исключений при изменении структуры, потому что они работают с клоном коллекции instead of оригинала.

    Итератор коллекции CopyOnWriteArrayList и итератор представления keySet коллекции ConcurrentHashMap являются примерами итераторов fail-safe.

  7. Как избежать ConcurrentModificationException во время перебора коллекции?

    Первым делом, можно подобрать другой итератор, работающий по принципу fail-safe. К примеру, если вы используете List, то можете взять ListIterator. Если же вам нужна устаревшая коллекция — то используйте перечислители.

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

    • При использовании JDK 1.5 or выше, вам подойдут классы ConcurrentHashMap и CopyOnWriteArrayList. Это самый лучший вариант
    • Вы можете преобразовать список в массив и перебирать массив
    • Вы можете блокировать изменения списка на время перебора с помощью блока synchronized

    Обратите внимание, что последние два варианта негативно скажутся на производительности.

  8. What такое UnsupportedOperationException?

    Это исключение возникает при вызове метода, который не поддерживается данной коллекцией. К примеру, если вы создадите список только для чтения с помощью Collections.unmodifiableList(list), а потом у него вызовете метод add() or remove(), вы точно получите это исключение.

  9. Какие классы коллекций позволяют доступ к любому элементу?

    Классы ArrayList, HashMap, TreeMap, Hashtable позволяют доступ к любому элементу.

  10. What такое BlockingQueue?

    Это очередь, которая позволяет обрабатывать ситуации, когда из пустой очереди пытаются получить элемент, or когда пытаются добавить элемент в очередь, а место в ней закончилось. Методы блокирующей очереди могут быть четырех типов: Первые вызывают исключение, вторые возвращают специальные значения (null or false, в зависимости от операции), третьи блокируют текущий поток до тех пор пока операция не может быть выполнена, и четвертые блокируют поток только на определенный промежуток времени.

    Примеры можно посмотреть в этой статье.

  11. What такое очередь и стэк, перечислите разницу между ними?

    Коллекции, созданные для того чтобы хранить элементы для дальнейшей обработки. Кроме базовых операций интерфейса Collection, очереди поддерживают дополнительные операции добавления, удаления и проверки состояния element. Обычно, но не обязательно очереди работают по принципу FIFO — первым пришел, первым ушел. Стэк — почти How очередь, но работает по принципу LIFO — последним пришел, первым ушел.

    Независимо от порядка добавления/удаления, голова очереди это элемент, который будет удален при вызове методов remove() or poll(). Также обратите внимание на то, что Stack и Vector оба потокобезопасны.

    Использование: Используйте очередь если вы хотите обрабатывать поток элементов в том же порядке в котором они поступают. Хорошо для списка заданий и обработки requestов. Используйте стэк если вы хотите класть и удалять элементы только с вершины стэка, что полезно в рекурсивных алгоритмах.

    (А теперь отвлечемся и объясним все чуть иначе. Итак, представьте обойму автомата. Вы вставляете туда патроны по одному, только с одного конца. И с этого же конца, по одному их будет забирать затворный механизм при стрельбе. Это — стэк, положить элемент можно только на его вершину, снять оттуда же и больше ниоткуда. Последний положенный элемент будет снят первым.

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

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

  12. What такое интерфейсы Comparable и Comparator?

    В Java, все коллекции поддерживающие автоматическую сортировку, используют методы сравнения для того чтобы правильно рассортировать элементы. В качестве примера таких классов мы можем указать TreeSet, TreeMap и т.д. Для того чтобы рассортировать элементы, класс должен реализовать интерфейсы Comparator or Comparable. Именно поэтому классы-обертки How Integer, Double и String реализуют интерфейс Comparable. Интерфейс Comparable помогает сохранять естественную сортировку, тогда How Comparator позволяет сортировать элементы по разным особым шаблонам. Экземпляр компаратора обычно передается конструктору коллекции, если коллекция это поддерживает.

    (Encore une fois, je vais l'expliquer différemment. Une interface Comparatordécrit une méthode int compare(T o1, T o2), c'est-à-dire qu'un objet qui implémente cette interface peut être utilisé pour comparer deux autres objets de la même classe. Si cette méthode renvoie 0, les objets sont égaux, + 1 et -1 indiquent que le premier objet est le second "plus grand" ou vice versa. Le sens que vous donnez au concept de "plus" et de "moins" par rapport à vos objets est entièrement votre affaire. Autrement dit, vous décrivez une classe qui implémente l'interface Сomparator, et dans cette méthode vous définissez comment vous souhaitez comparer vos objets. Ensuite vous passez un objet de cette classe au constructeur d'une collection dans laquelle sont stockés les objets comparés par cette méthode, et la collection pourra pour les trier par ordre croissant/décroissant. Je le répète - vous avez une collection dans laquelle les objets de la classe T sont stockés, et il y a un autre objet d'une classe différente qui implémente l'interface Comparator, dont l'essence est qu'elle peut les comparer objets de classeT ; il n’est nécessaire pour rien d’autre.

    L'interface Comparabledécrit une méthode int compareTo(T o), c'est-à-dire qu'elle est appelée non pas pour comparer deux autres objets, mais pour se comparer avec quelqu'un d'autre. Autrement dit, vous n'avez pas besoin d'un objet de comparaison distinct ; vous intégrez le mécanisme de comparaison dans l'élément lui-même stocké dans la collection. Ce qui est plus pratique et dans quelle situation c'est à vous de décider. (Remarque par.))

  13. Que sont les cours Collectionset Arrays?

    Les classes Collectionssont Arraysdes classes utilitaires spéciales permettant de travailler avec des classes de collection. Ils permettent de transformer des collections, de les rendre protégées en écriture ou thread-safe, de les trier de différentes manières, etc.

  14. Liste de la littérature utilisée

    Eh bien, ce n'est pas une question d'entretien. Juste pour le fun. (Mais pour atteindre le nirvana, vous devez lire autant d'articles que possible, vos cheveux deviendront soyeux et bouclés et votre karma sera effacé. (Environ.))

J'espère que ces questions vous aideront lors de votre prochain entretien. À l'avenir, je vous conseille de lire quelque chose de plus. Plus vous en savez, mieux vous vous portez ! Bonnes études ! Article original
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION