JavaRush /Java Blog /Random-IT /Domande frequenti nell'intervista sulle classi di raccolt...
theGrass
Livello 24
Саратов

Domande frequenti nell'intervista sulle classi di raccolta in Java (parte 1)

Pubblicato nel gruppo Random-IT
Senza dubbio, le raccolte in Java sono un'area molto importante e le domande sulle raccolte verranno poste nelle interviste sia ai programmatori nuovi che a quelli esperti. L’argomento è così vasto che è quasi impossibile trattarlo interamente. Tuttavia, sulla base delle mie interviste precedenti, cercherò di elencare quante più BUONE domande possibili per le quali dovresti essere preparato. Domande frequenti nell'intervista sulle classi di raccolta in Java (parte 1) - 1Le domande saranno sia complesse che semplici, quindi se la domanda ti sembra troppo primitiva, non dimenticare che è perfetta per un programmatore meno esperto.

Domande in questo articolo:

Problemi generali
  1. Cosa sono le raccolte in Java? Elenca i loro vantaggi
  2. Raccontaci della gerarchia delle collezioni
  3. Perché le raccolte non ereditano le interfacce Cloneablee Serializable?
  4. Perché Mapl'interfaccia non eredita l'interfaccia Collection?
Domande sulle liste
  1. Perché usiamo le liste? Quali classi principali implementano l'interfaccia List?
  2. Come convertire un array di stringhe in ArrayList?
  3. Come ordinare un elenco in ordine inverso?
Domande sugli insiemi
  1. Perché usiamo i set? Quali classi principali implementano l'interfaccia Set?
  2. Come vengono memorizzati gli elementi in HashSet?
  3. nullÈ possibile aggiungere un elemento a TreeSeto HashSet?
Domande sui dizionari
  1. Perché usiamo i dizionari? Quali classi principali implementano l'interfaccia Map?
  2. Cos'è IdentityHashMape WeakHashMap?
  3. Spiegare di cosa si tratta ConcurrentHashMap? Come funziona?
  4. Come funzionano i dizionari?
  5. Come creare una buona chiave del dizionario?
  6. Quali visualizzazioni dei contenuti fornisce l'interfaccia Map?
  7. Quando dovresti usarlo HashMape quando dovresti usarlo TreeMap?
Domande sulle differenze tra le diverse collezioni
  1. Quali sono le differenze tra Sete List?
  2. Quali sono le differenze tra Liste Map?
  3. Nomina le differenze tra HashMapeHashTable?
  4. Quali sono le differenze tra Vectore ArrayList?
  5. Quali sono le differenze tra Iteratore Enumeration?
  6. Quali sono le differenze tra HashMape HashSet?
  7. Quali sono le differenze tra Iteratore ListIterator?
  8. Quali sono le differenze tra TreeSete SortedSet?
  9. Quali sono le differenze tra ArrayListe LinkedList?
E altre domande
  1. Come rendere una raccolta di sola lettura?
  2. Come creare una raccolta thread-safe?
  3. Perché non esiste un metodo Iterator.add()per aggiungere elementi a una raccolta?
  4. Quali modi ci sono per scorrere gli elementi di un elenco?
  5. Come si fa a capire che la proprietà iteratore funziona fail-fast?
  6. Qual è la differenza tra fail-faste fail-safe?
  7. Come evitare ConcurrentModificationExceptiondurante l'iterazione di una raccolta?
  8. Che è successo UnsupportedOperationException?
  9. Quali classi di raccolta danno accesso a qualsiasi elemento?
  10. Che è successo BlockingQueue?
  11. Cos'è una coda e uno stack, elenca le differenze tra loro?
  12. Cosa sono le interfacce Comparablee Comparator?
  13. Cosa sono le classi Collectionse Arrays?
  14. Elenco della letteratura usata
Senza perdere tempo, cominciamo con le spiegazioni.

Problemi generali

  1. Cosa sono le raccolte in Java? Elencare i loro vantaggi?

    Per definizione, una collezione è un oggetto che è un gruppo di oggetti. Come nella teoria degli insiemi, un insieme è un gruppo di oggetti. Semplice, no? Prima di JDK 1.2 esistevano classi come Vectore HashTable, ma non esisteva alcun framework Collection. Quindi si è deciso di aggiungere il supporto per strutture dati riutilizzabili. Questo framework è stato sviluppato principalmente da Joshua Bloch ed è apparso per la prima volta in JDK 1.2.

    Possiamo elencare i principali vantaggi:

    • Riduce il tempo impiegato nella scrittura del codice
    • Migliora le prestazioni attraverso l'uso di algoritmi e strutture dati altamente efficienti
    • Le raccolte rappresentano un modo universale per archiviare e trasferire dati, che semplifica l'interazione di diverse parti del codice
    • Facile da imparare perché è necessario apprendere solo le interfacce più importanti e le operazioni supportate
  2. Ci parli della gerarchia delle collezioni?

    Domande frequenti nell'intervista sulle classi di raccolta in Java (parte 1) - 2

    Come mostrato nell'immagine, il framework delle raccolte contiene un'interfaccia di livello superiore - Collection, da cui vengono ereditati Set, Liste Queue. Di seguito esamineremo molte altre classi contenute in questi tre rami. Ricorda il titolo dell'interfaccia Collection, ti aiuterà con molte domande.

    public interface Collection extends Iterable {
    //описание методов
    }

    Il framework contiene anche l'interfaccia Map , che non è una discendente di Collection. Vedremo il motivo per cui non eredita Collectionnella quarta domanda.

  3. Perché le raccolte non ereditano le interfacce Cloneablee Serializable?

    Ebbene, la risposta più semplice è “perché non è necessario”. La funzionalità è fornita dalle interfacce Cloneablee Serializablesemplicemente non è necessaria per le raccolte.

    Un altro motivo è che una sottoclasse non è sempre necessaria Cloneableperché ogni operazione di clonazione consuma molta memoria e i programmatori inesperti possono sprecarla senza comprenderne le conseguenze.

    E l’ultimo motivo è che la clonazione e la serializzazione sono operazioni molto specifiche e dovrebbero essere implementate solo quando necessario. Molte classi di raccolta implementano queste interfacce, ma non è assolutamente necessario implementarle per tutte le raccolte in generale. Se hai bisogno di clonazione e serializzazione, usa semplicemente le classi dove si trova, altrimenti usa le classi rimanenti.

  4. Perché Mapl'interfaccia non eredita l'interfaccia Collection?

    Una buona risposta a questa domanda è “perché sono incompatibili”. L'interfaccia Collectiondescrive il metodo add(Object o).

    I dizionari non possono contenere questo metodo perché funzionano con coppie chiave/valore. Inoltre, i dizionari hanno rappresentazioni keySetche valueSet,non si trovano nelle raccolte.

    A causa di queste differenze, un'interfaccia Mapnon può ereditare un'interfaccia Collectioned è un ramo separato della gerarchia.

Domande sulle liste

  1. Perché usiamo le liste? Quali classi principali implementano l'interfaccia List?

    Le liste in Java sono una raccolta ordinata di elementi. Ogni elemento ha un indice che parte da zero. Tutti gli indici sono unici. Oltre ai metodi descritti nell'interfaccia Collection, gli elenchi hanno i propri metodi, principalmente per lavorare con gli elementi della raccolta in base al loro indice. Puoi dividere questi metodi in 3 gruppi: cercare un elemento, ottenere un elemento specifico, scorrere una raccolta e selezionare un sottogruppo. Tutte queste operazioni possono essere eseguite dall'indice dell'elemento.

    Le classi principali che implementano l' interfaccia Listsono Stack, Vectore ArrayList. LinkedListPer informazioni più dettagliate su di essi, fare riferimento alla documentazione.

  2. Come convertire un array di stringhe in ArrayList?

    Questa domanda è un po' più profonda della semplice programmazione, come sembra ai principianti. Il suo scopo è testare la conoscenza del candidato delle classi di utilità del framework Collection. Consideriamo due di queste classi che sono più richieste durante le interviste: Collectionse Arrays.

    La classe Collectionsfornisce metodi statici per le operazioni sulle raccolte. Di conseguenza, Arraysfornisce metodi statici per le operazioni sugli array.

    String[] words = {"аз", "буки", "веди", "глагол", "добро"};
    //Как вы можете обратить внимание, у нас есть массив строк String[] words.
    //В котором у нас лежат 5 строк.
    List wordList = Arrays.asList(words);
    //легким движением руки, а точнее вызовом Arrays.asList() мы превратor наш
    //массив строк в список List wordList.

    Vorrei anche notare che questo metodo è in grado di elaborare non solo stringhe, ma creerà un elenco di elementi di qualsiasi tipo fosse l'array.

    Integer[] nums = {1, 2, 3, 4};
    List numList = Arrays.asList(nums);
  3. Come ordinare un elenco in ordine inverso?

    Come la precedente, questa domanda mette alla prova la tua conoscenza delle classi di utilità.Collection

    List reversedList = Collections.reverse(list);

Domande sugli insiemi

  1. Perché usiamo i set? Quali classi principali implementano l'interfaccia Set?

    Он моделирует математическое множество, из теории множеств. Интерфейс Set похож на List, но имеет некоторые отличия. Первое — это не упорядоченная коллекция. Следовательно, добавление/удаление элементов не требует их сортировки. Главная особенность множеств - уникальность элементов, то есть один и тот же элемент не может содержаться в множестве дважды.

    Очень важными для функционирования множеств являются методы equals() и hashCode(), они позволяют сравнивать множества разных классов. Два множества являются идентичными только если они содержат одни и те же элементы.

    Как следует из вышеизложенного, множества не поддерживают операций основанных на индексе element, How списки. Множества имеют только те методы которые описаны в интерфейсе Collection

    Основными классами, реализующими интерфейс Set, являются EnumSet, HashSet, LinkedHashSet и TreeSet. Если хотите узнать больше — почитайте соответствующие разделы documentации Java.

  2. Как хранятся элементы в HashSet?

    Как вы уже в курсе, HashMap хранит пары ключ/meaning, и ключи должны быть уникальны. HashSet использует эту особенность HashMap для обеспечения уникальности своих элементов. В классе HashSet, словарь описан следующим образом:

    private transient HashMap<E, Object> map;
    private static final Object PRESENT = new Object();

    Итак, когда вы сохраняете элемент в множестве, оно кладет данный элемент в качестве ключа в словарь, а meaningм идет an object PRESENT, How это описано ниже:

    public boolean add(E e) {
      return map.put(e, PRESENT) == null;
    }

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

  3. Может ли элемент null быть добавлен в TreeSet or HashSet?

    Как видно из предыдущего ответа, в методе add() нет проверки на null. Также, HashMap позволяет один ключ null, следовательно, один элемент null может быть добавлен в HashSet.

    TreeSet работает по тому же принципу что и HashSet, но использует NavigableMap для хранения элементов

    private transient NavigableMap<E,Object> m;
    private static final Object PRESENT = new Object();

    NavigableMap это класс-наследник SortedMap, а SortedMap не позволяет использование ключей null. Следовательно, и TreeMap не поддерживает хранение элементов типа null. Если вы попробуете добавить null в TreeSet, получите исключение NullPointerException.

Вопросы про словари

  1. Почему мы используем словари (Map)? Какие основные классы реализуют интерфейс Map?

    Словари — специальный тип коллекции, которая используется для хранения пар ключ/meaning. По этой причине он не является наследником интерфейса Collection. Словарь предоставляет методы для добавления пар ключ/meaning, удаления, поиска и перебора по предоставляемым словарем представлениям данных.

    Основные классы реализующие интерфейс Map: HashMap, Hashtable, EnumMap, IdentityHashMap, LinkedHashMap и Properties.

  2. What такое IdentityHashMap и WeakHashMap?

    IdentityHashMap похож на HashMap за одним исключением — для сравнения an objectов используется сравнение указателей на an objectы, если указатели не равны (указывают на an objectы лежащие по разным addressм), значит an objectы считаются различными.

    IdentityHashMap является довольно редко используемым. Хотя он реализует интерфейс Map, он нарушает один из основных принципов устройства Map, который требует использования метода equals() для сравнения an objectов.

    IdentityHashMap используется только в тех случаях, когда требуется сравнение an objectов по их addressм.

    WeakHashMap это реализация интерфейса Map, которая содержит слабые ссылки на элементы. То есть, если за пределами WeakHashMap не осталось ни одной ссылки на его элемент, этот элемент удаляется сборщиком мусора. Класс предназначен для использования с an objectми, у которых метод equals() проверяет идентичность an objectов с помощью оператора ==. После того How элемент будет удален сборщиком мусора, он уже не может быть восстановлен, и к большому удивлению программиста найти его в словаре больше не получится.

  3. Объясните что такое ConcurrentHashMap? Как оно работает?

    Взято с официальной documentации:
    Реализация словаря fully поддерживающая многопоточное добавление/удаление/поиск элементов. Данный класс следует тем же спецификациям что и Hashtable, и содержит методы соответствующие методам Hashtable. Однако, хотя все операции являются потокобезопасными, операция по выборке элементов не блокирует таблицу, и вообще нет возможности запретить весь доступ к таблице. Этот класс совместим с Hashtable во всем кроме вопросов многопоточной синхронизации.

  4. Как работает hashmap?

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

    Ответ на этот вопрос очень обширный, и fully его можно прочесть в этой статье — How работает hashmap. А на данный момент просто запомните что HashMap работает на основе хэширования. Словарь, по определению, это an object который связывает ключи и значения. Для хранения таких структур, он использует внутренний класс Entry.

    static class Entry implements Map.Entry
    {
    final K key;
    V value;
    Entry next;
    final int hash;
    ...//Еще много codeа тут
    }

    Переменные key и value служат для хранения ключа и значения. А сами an objectы Entry лежат в массиве.

    /**
    * Размер таблицы меняется по необходимости,
    * и обязательно должен быть equals степени двойки
    */
    transient Entry[] table;

    Индекс нужного element в массиве вычисляется по хэш-codeу ключа. Больше информации можете получить по ссылке в начале ответа.

  5. Как создать хороший ключ для словаря?

    Следующий хороший вопрос, который обычно задают следом за вопросом о функционировании HashMap. Итак, главное ограничение — ключ должен быть таким, чтобы потом по нему можно было получить из словаря meaning. Иначе в его использовании просто нет смысла. Если вы понимаете How функционирует hashmap, вы знаете что его работа сильно зависит от методов hashCode() и equals() an objectов-ключей.

    Come segue da quanto sopra, una buona chiave dovrebbe dare hashCodesempre la stessa chiave, non importa quante volte venga richiesta. Inoltre, chiavi identiche equals()dovrebbero restituire true quando si chiama un metodo e chiavi diverse dovrebbero restituire false.

    Da ciò ne consegue che i migliori candidati per il ruolo di chiave sono classi immutabili.

    Puoi leggere di più su .

  6. Quali visualizzazioni dei contenuti fornisce l'interfaccia Map?

    L'interfaccia Mapfornisce tre visualizzazioni dei dati memorizzati:

    • set di tutte le chiavi
    • insieme di tutti i valori
    • un insieme di oggetti Entrycontenenti sia una chiave che un valore

    Puoi esplorarli utilizzando gli iteratori.

  7. Quando dovresti usarlo HashMape quando dovresti usarlo TreeMap?

    HashMapquesta è una classe molto utilizzata e tu lo sai. Quindi mi limiterò a dire che memorizza coppie chiave/valore e consente di eseguire molte operazioni su di esse.

    TreeMapquesta è una varietà speciale HashMap. La differenza è che le chiavi TreeMapsono conservate in modo ordinato. L'impostazione predefinita è "ordinamento naturale". È possibile sovrascrivere l'ordinamento fornendo un'istanza della classe Comparator, il comparecui metodo verrà utilizzato per ordinare le chiavi.

    Tieni presente che tutte le chiavi aggiunte al dizionario devono implementare l'interfaccia Comparable(questo è necessario per l'ordinamento). Inoltre, tutte le chiavi devono essere reciprocamente compatibili: k1.compareTo(k2)non devono richiamarne ClassCastExceptionnessuna k1e k2memorizzate nel dizionario. Se l'utente tenta di inserire una chiave nel dizionario che viola questa condizione (ad esempio, una chiave di stringa in un dizionario in cui tutte le chiavi sono di tipo Integer), il metodo put(Object key, Object value)dovrebbe chiamare ClassCastException.

Articolo originale
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION