JavaRush /Blog Java /Random-PL /HashMap i ConcurrentHashMap popularne pytania do rozmów k...
furs08
Poziom 11

HashMap i ConcurrentHashMap popularne pytania do rozmów kwalifikacyjnych

Opublikowano w grupie Random-PL
W moim ostatnim podglądzie mówiłem o „Jak działa HashMap w Javie ”. Mówiłem o wewnętrznych elementach tej klasy i o tym, jak pasują one do koncepcji. Ale kiedy zapytano mnie o HashMap i powiązane rzeczy, pytający nie poprzestał tylko na podstawowej koncepcji. W trakcie dyskusji poruszane są różne kierunki, ostatecznie wszystko sprowadza się do tego, że albo naprawdę rozumiesz te rzeczy, albo nie. HashMap i ConcurrentHashMap popularne pytania do wywiadów - 1W tym podglądzie postaram się omówić wszystkie główne tematy pytań na rozmowie kwalifikacyjnej: Omawiane tematy:
  1. Jak utworzyć klucz dla HashMap?
  2. Różnice między HashMap i ConcurrentHashMap?
  3. Różnice między Collections.synchronizedMap(HashMap) i HashMap?
  4. Różnice między ConcurrentHashMap i Collections.synchronizedMap(HashMap)?
  5. Różnice między HashMap i HashTable?
  6. Różnice między HashTable i Collections.synchronizedMap(HashMap)?
  7. Wpływ losowych/stałych wartości hashCode() na klucz
  8. Używanie HashMap w niezsynchronizowanym kodzie w aplikacjach wielowątkowych
Więc zacznijmy:
  1. Generowanie klucza dla HashMap

    Jedną z głównych potrzeb jest to, że musimy zwrócić wartość obiektu bez błędów. Prawidłowy? W przeciwnym razie nie jest jasne, jak wyobrazić sobie projektowaną strukturę danych. Nie będzie można z niego skorzystać. Aby zdecydować, że stworzyliśmy dobry klucz, musimy wiedzieć, jak działa HashMap. HashMap jest zbudowany na zasadach Hashowania. Klucz w kodzie skrótu jest używany głównie w połączeniu z metodą równości() do dodawania i wyszukiwania elementu w HashMap. Jeśli kod skrótu obiektu zostanie zmieniony na inną parę klucz-wartość, uzyskanie wartości z mapy jest prawie niemożliwe. Ten przypadek nazywa się wyciekiem pamięci. Aby tego uniknąć, klucz i mapa muszą być niezmienne. Jest to główny powód, dla którego niezmienne klasy, takie jak String, Integer i inne podobne klasy, są dobrym wyborem przy tworzeniu klucza.

    Pamiętaj jednak, że niezmienność jest zalecana, ale nie wymagana. Jeśli chcesz, aby kluczem był obiekt zmienny, musisz upewnić się, że obiekt kluczowy nie zmienia kodu skrótu obiektu. Można to zrobić, zastępując metodę hashCode(). Ponadto klasy kluczowe muszą poprawnie współpracować z metodami hashCode() i równości(), aby uniknąć niepożądanego i zaskakującego zachowania podczas wykonywania.

  2. Różnice między HashMap i ConcurrentHashMap

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

    HashMap i ConcurrentHashMap popularne pytania do wywiadów - 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    — Да.

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

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

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

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

    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;
        }
    }

    Więcej na ten temat w następnym artykule. Jeśli artykuł okazał się przydatny, udostępnij go znajomym! Miłej nauki!

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