JavaRush /Java-Blog /Random-DE /Beliebte Interviewfragen zu HashMap und ConcurrentHashMap...
furs08
Level 11

Beliebte Interviewfragen zu HashMap und ConcurrentHashMap

Veröffentlicht in der Gruppe Random-DE
In meiner letzten Vorschau habe ich über „Wie HashMap in Java funktioniert “ gesprochen. Ich habe über die Interna dieser Klasse gesprochen und wie sie in das Konzept passen. Aber als ich nach HashMap und verwandten Dingen gefragt wurde, blieb der Fragesteller nicht beim Grundkonzept stehen. Während der Diskussion werden verschiedene Richtungen angesprochen, am Ende kommt es darauf an, dass man diese Dinge entweder wirklich versteht oder nicht. Beliebte Interviewfragen zu HashMap und ConcurrentHashMap – 1In dieser Vorschau werde ich versuchen, alle Hauptthemen der Interviewfragen abzudecken: Behandelte Themen:
  1. Wie erstelle ich einen Schlüssel für eine HashMap?
  2. Unterschiede zwischen HashMap und ConcurrentHashMap?
  3. Unterschiede zwischen Collections.synchronizedMap(HashMap) und HashMap?
  4. Unterschiede zwischen ConcurrentHashMap und Collections.synchronizedMap(HashMap)?
  5. Unterschiede zwischen HashMap und HashTable?
  6. Unterschiede zwischen HashTable und Collections.synchronizedMap(HashMap)?
  7. Auswirkung zufälliger/fester hashCode()-Werte für einen Schlüssel
  8. Verwendung von HashMap in unsynchronisiertem Code in Multithread-Anwendungen
Also lasst uns anfangen:
  1. Generieren eines Schlüssels für eine HashMap

    Eine der Hauptanforderungen besteht darin, dass wir den Wert des Objekts fehlerfrei zurückgeben müssen. Rechts? Ansonsten ist nicht klar, wie man sich die von Ihnen entworfene Datenstruktur vorstellen soll. Es wird unmöglich sein, es zu verwenden. Um zu entscheiden, ob wir einen guten Schlüssel erstellt haben, müssen wir wissen, wie eine HashMap funktioniert. HashMap basiert auf den Prinzipien des Hashing. Der Schlüssel im Hash-Code wird hauptsächlich in Kombination mit der Methode equal() verwendet, um ein Element in der HashMap hinzuzufügen und danach zu suchen. Wenn der Hash-Code eines Objekts in ein anderes Schlüssel-Wert-Paar geändert wird, ist es nahezu unmöglich, den Wert aus der Map abzurufen. Dieser Fall wird als Speicherleck bezeichnet. Um dies zu vermeiden, müssen Schlüssel und Karte unveränderlich sein. Dies ist der Hauptgrund, warum unveränderliche Klassen wie String, Integer und andere ähnliche Klassen eine gute Wahl für die Erstellung eines Schlüssels sind.

    Denken Sie jedoch daran, dass Unveränderlichkeit empfohlen, aber nicht erforderlich ist. Wenn Sie ein veränderliches Objekt zum Schlüssel machen möchten, müssen Sie sicherstellen, dass das Schlüsselobjekt den Hash-Code des Objekts nicht ändert. Dies kann durch Überschreiben der hashCode()-Methode erfolgen. Darüber hinaus müssen Schlüsselklassen korrekt mit den Methoden hashCode() und equal() zusammenarbeiten, um unerwünschtes und überraschendes Ausführungsverhalten zu vermeiden.

  2. Unterschiede zwischen HashMap und ConcurrentHashMap

    Wasбы лучше визуализировать СoncurrentHashMap нужно рассматривать этот класс Wie группу HashMap’ов. Wasбы брать и класть значения пар(key-value) в HashMap необходимо вычислить хэш-Code и найти правильный сегмент массива Collection.Entry. В ConcurrentHashMap отличие заключается во внутренней структуре для хранения пар key-value. ConcurrentHashMap имеет дополнительную концепцию сегментов. Будет легко понять если представить, что один сегмент эквивалентен одному HashMap[концептуально]. ConcurrentHashMap разделена на множество сегментов [по умолчанию их число равно 16] при инициализации. ConcurrentHashMap похожим потокам примерно (16) получать одновременный доступ к этому сегменту, каждый поток работает одновременно с высоким параллелизмом. Отсюда, если ваша пара key-value хранится в сегменте 10 не нужно блокировать остальные 15 сегментов дополнительно. Такая структура обеспечивает очень высокий уровень параллелизма.

    Beliebte Interviewfragen zu HashMap und ConcurrentHashMap – 2

    Другими словами Concurrent HashMap использует множество замков и каждый замок управляет одним сегментом структуры. Установки данных в определенном сегменте заблокированы для получения в этом сегменте так синхронизированы операции обновления. При получении данных, чтения на лету используется без синхронизации. Если считывать данные на лету то сегмент блокируется и запись производится в синхронизированный блок.

  3. Различия между HashMap и Collection.synchronizedMap(HashMap)

    Все на самом деле просто! HashMap не синхронизирована и Collection.synchronizedMap(HashMap) возвращает упакованные методы HashMap которые являются синхронизированными get и put методами.

    Фактически, Collection.synchronizedMap(HashMap) внутренне созданного внутреннего класса SunchronizedMap содержащего пары key-value передающиеся в HashMap Wie аргумент. Такой пример внутренних классов ничего не меняет в первоначальных параметрах HashMap и является völlig независимым.

  4. Различия между ConcurrentHashMap и Collections.synchronizedMap(HashMap)

    Оба являются синхронизированными Ausführungми HashMap c различиями в функциональности и внутренней структуре. Как указано выше ConcurrentHashMap состоит из внутренних сегментов, которые могут рассматриваться Wie независимые HashMap’ы концептуально. Все эти сегменты могу быть заблокированы отдельными потоками выполняемыми одновременно. Таким образом несколько потоков могу одновременно получить/положить пары key-value из ConcurrentHashMap без блокирования/ожидания друг друга.

    Из Collections.synchronizedMap() мы получаем синхронизированную версию HashMap и доступ в блокировании образом. Это означает то что если несколько потоков пытаются получить доступ к synchronizedMap в одно и тоже время им будет позволено взять/положить пары key-value по одному синхронизированному образу.

  5. Различия между HashMap и HashTable

    Этот вопрос также является простым. Главное различие в том что HashTable синхронизирован а HashMap нет. Если вас спросят по другим причинам то скажите им что HashTable является наследием класса (часть JDK 1.0) который был произведен в рамках коллекции реализовав интерфейс Map позже. В нем все еще есть вещи которых нету в HashMap такие к примеру Wie Enumerators(счётчики). Другой незначительной причиной является то что HashMap поддерживает ключ со Bedeutungм null.(Отображаемый Wie пустая область памяти). HashTable не поддерживает ключ со Bedeutungм null и вызывает исключение NullPointerException, при попытке его задать.

  6. Различия между HashTable и Collection.synchronized(HashMap)

    До сих пор вы возможно только знали об их сходствах. Оба являются синхронизированными Ausführungми коллекций. Оба имеют синхронизированные методы внутри. Оба блокируют потоки и заставляют ждать когда можно взять/положить что-либо в коллекцию. Так в чем же различия? Хорошо! Нет основных различий для указанных выше причин. Производительность обоих одинакова. Единственное что различает их это то что HashTable наследуемый класс он получил свои дополнительные функции такие Wie Enumerators(счетчики).

  7. Влияние случайных/фиксированных значений для значения ключа.

    Влияние в обоих случаях будь то фиксированное Bedeutung oder случайное будет иметь одинаковый результат и это необъяснимое поведение. Большое Bedeutung имеет место в HashMap где поставить пару key-value и где восстановить. Если положение ein Objektа ключа меняется каждый раз то его положение будет рассчитываться каждый раз разными способами. Таким образом ein Objekt хранящийся в HashMap будет потерян навсегда с минимальной возможностью восстановления. Поэтому значения ключей являются неизменными и каждый раз возвращают уникальные значения.

  8. Использование HashMap в несинхронизированном Codeе многопоточных приложений.

    — в худшем случае это может вызвать бесконечный цикл.

    — Да.

    — Ты был прав это действительно может привести к бесконечному циклу. Ты спросишь: "Как?"

    — Хорошо! Вот причина!

    HashMap имеет концепцию повторного хеширования, когда достигает своего верхнего предела. Это процесс создания новой области памяти и копирования туда существующих элементов. Допустим Поток A положил пару key-value в Map и повторное хеширование началось, в то же время поток Б начал манипулировать с областью памяти используя операцию put(положить). Во время повторного хеширования существует возможность для создания циклической зависимости где элемент находящийся в ссылочном листе [в любой области памяти] может указывать на любой предыдущий узел в ту же область памяти. Это приведет к бесконечному циклу так Wie Code повторного хеширования содержит в себе while(TRUE) {//получаем следующий узел} который будет работать бесконечно.

    Посмотрите внимательно на этот Code содержащий метод передачи использующий операцию повторного хеширования:

    public Object get(Object key) {
        Object k = maskNull(key);
        int hash = hash(k);
        int i = indexFor(hash, table.length);
        Entry e = table[i];
    
        //While true is always a bad practice and cause infinite loops
    
        while (true) {
            if (e == null)
                return e;
            if (e.hash == hash && eq(k, e.key))
                return e.value;
            e = e.next;
        }
    }

    Mehr dazu im nächsten Artikel. Wenn Sie den Artikel nützlich fanden, teilen Sie ihn bitte mit Ihren Freunden! Viel Spaß beim Lernen!

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION