JavaRush /Java Blog /Random-KO /HashMap 및 ConcurrentHashMap 인기 인터뷰 질문
furs08
레벨 11

HashMap 및 ConcurrentHashMap 인기 인터뷰 질문

Random-KO 그룹에 게시되었습니다
지난 프리뷰에서 " HashMap이 Java에서 작동하는 방식 "에 대해 이야기했습니다. 저는 이 수업의 내부 구조와 그것이 개념에 어떻게 부합하는지에 대해 이야기했습니다. 그런데 HashMap 및 관련 사항에 대한 질문을 받았을 때 질문자는 기본 개념에만 머물지 않았습니다. 토론하는 동안 다양한 방향이 다루어지며 결국 모든 것은 당신이 이러한 것들을 정말로 이해하는지 아니면 이해하지 못하는지에 달려 있습니다. HashMap 및 ConcurrentHashMap 인기 면접 질문 - 1이번 미리보기에서는 인터뷰 질문의 모든 주요 주제를 다루려고 노력할 것입니다: 다루는 주제:
  1. HashMap의 키를 만드는 방법은 무엇입니까?
  2. HashMap과 ConcurrentHashMap의 차이점은 무엇입니까?
  3. Collections.synchronizedMap(HashMap)과 HashMap의 차이점은 무엇입니까?
  4. ConcurrentHashMap과 Collections.synchronizedMap(HashMap)의 차이점은 무엇입니까?
  5. HashMap과 HashTable의 차이점은 무엇입니까?
  6. HashTable과 Collections.synchronizedMap(HashMap)의 차이점은 무엇입니까?
  7. 키에 대한 무작위/고정 hashCode() 값의 영향
  8. 멀티스레드 애플리케이션의 비동기 코드에서 HashMap 사용
그럼 시작해 보겠습니다.
  1. HashMap에 대한 키 생성

    주요 요구 사항 중 하나는 오류 없이 개체의 값을 반환해야 한다는 것입니다. 오른쪽? 그렇지 않으면 설계 중인 데이터 구조를 어떻게 상상해야 할지 명확하지 않습니다. 사용이 불가능해집니다. 좋은 키를 생성했는지 결정하려면 HashMap이 어떻게 작동하는지 알아야 합니다. HashMap은 해싱의 원칙을 기반으로 구축되었습니다. 해시 코드의 키는 HashMap의 요소를 추가하고 검색하기 위해 주로 equals() 메서드와 함께 사용됩니다. 객체의 해시 코드가 다른 키-값 쌍으로 변경되면 맵에서 값을 얻는 것이 거의 불가능합니다. 이런 경우를 메모리 누수라고 합니다. 이를 방지하려면 키와 맵이 변경 불가능해야 합니다. 이것이 String, Integer 및 기타 유사한 클래스와 같은 불변 클래스가 키 생성에 좋은 선택인 주된 이유입니다.

    그러나 불변성은 권장되지만 필수는 아니라는 점을 기억하십시오. 변경 가능한 객체를 키로 만들려면 키 객체가 객체의 해시 코드를 변경하지 않도록 해야 합니다. 이는 hashCode() 메서드를 재정의하여 수행할 수 있습니다. 또한 원치 않는 예상치 못한 실행 동작을 방지하려면 키 클래스가 hashCode() 및 equals() 메서드와 올바르게 작동해야 합니다.

  2. HashMap과 ConcurrentHashMap의 차이점

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

    HashMap 및 ConcurrentHashMap 인기 면접 질문 - 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    — Да.

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

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

    HashMap имеет концепцию повторного хеширования, когда достигает своего верхнего предела. Это процесс создания новой области памяти и копирования туда существующих элементов. Допустим Поток A положил пару key-value в Map и повторное хеширование началось, в то же время поток Б начал манипулировать с областью памяти используя операцию put(положить). Во время повторного хеширования существует возможность для создания циклической зависимости где элемент находящийся в ссылочном листе [в любой области памяти] может указывать на любой предыдущий узел в ту же область памяти. Это приведет к бесконечному циклу так How 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;
        }
    }

    이에 대한 자세한 내용은 다음 기사에서 확인하세요. 기사가 유용하다고 생각되면 친구들과 공유해 주세요! 즐거운 학습!

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION