JavaRush /Java Blog /Random-ID /Pertanyaan wawancara populer HashMap dan ConcurrentHashMa...
furs08
Level 11

Pertanyaan wawancara populer HashMap dan ConcurrentHashMap

Dipublikasikan di grup Random-ID
Dalam pratinjau terakhir saya, saya berbicara tentang “Bagaimana HashMap bekerja di Java ”. Saya berbicara tentang internal kelas ini dan bagaimana kesesuaiannya dengan konsep. Namun ketika saya ditanya tentang HashMap dan hal-hal terkait, penanya tidak berhenti pada konsep dasarnya saja. Selama diskusi, arah yang berbeda disinggung, pada akhirnya semuanya bermuara pada apakah Anda benar-benar memahami hal-hal ini atau tidak. Pertanyaan wawancara populer HashMap dan ConcurrentHashMap - 1Dalam pratinjau ini, saya akan mencoba membahas semua topik utama pertanyaan wawancara: Topik yang dibahas:
  1. Bagaimana cara membuat kunci untuk HashMap?
  2. Perbedaan antara HashMap dan ConcurrentHashMap?
  3. Perbedaan antara Koleksi.synchronizedMap(HashMap) dan HashMap?
  4. Perbedaan antara ConcurrentHashMap dan Collections.synchronizedMap(HashMap)?
  5. Perbedaan antara HashMap dan HashTable?
  6. Perbedaan antara HashTable dan Collections.synchronizedMap(HashMap)?
  7. Dampak nilai hashCode() acak/tetap untuk sebuah kunci
  8. Menggunakan HashMap dalam kode yang tidak disinkronkan dalam aplikasi multi-thread
Jadi mari kita mulai:
  1. Menghasilkan kunci untuk HashMap

    Salah satu kebutuhan utamanya adalah kita harus mengembalikan nilai objek tanpa kesalahan. Benar? Jika tidak, tidak jelas bagaimana membayangkan struktur data yang Anda rancang. Tidak mungkin untuk digunakan. Untuk memutuskan bahwa kita telah membuat kunci yang baik, kita perlu mengetahui cara kerja HashMap. HashMap dibangun berdasarkan prinsip Hashing. Kunci dalam kode hash digunakan terutama dalam kombinasi dengan metode sama dengan() untuk menambahkan dan mencari elemen di HashMap. Jika kode hash suatu objek diubah ke pasangan nilai kunci lain, maka hampir tidak mungkin mendapatkan nilai dari Peta. Kasus ini disebut kebocoran memori. Untuk menghindari hal ini, kunci dan peta harus tidak dapat diubah. Inilah alasan utama mengapa kelas yang tidak dapat diubah seperti String, Integer, dan kelas serupa lainnya merupakan pilihan yang baik untuk membuat kunci.

    Namun perlu diingat bahwa kekekalan dianjurkan, tetapi tidak wajib. Jika Anda ingin menjadikan objek yang bisa berubah sebagai kunci, maka Anda harus memastikan bahwa objek kunci tidak mengubah kode hash objek tersebut. Hal ini dapat dilakukan dengan mengganti metode hashCode(). Selain itu, kelas kunci harus bekerja dengan benar dengan metode hashCode() dan equal() untuk menghindari perilaku eksekusi yang tidak diinginkan dan mengejutkan.

  2. Perbedaan antara HashMap dan ConcurrentHashMap

    Untuk memvisualisasikan ConcurrentHashMap dengan lebih baik, Anda perlu mempertimbangkan kelas ini sebagai grup HashMaps. Untuk mengambil dan memasukkan nilai pasangan kunci-nilai ke dalam HashMap, Anda perlu menghitung kode hash dan menemukan segmen yang benar dari array Collection.Entry. Perbedaannya dengan ConcurrentHashMap adalah struktur internal untuk menyimpan pasangan nilai kunci. ConcurrentHashMap memiliki konsep tambahan segmen. Akan mudah dipahami jika Anda membayangkan satu segmen setara dengan satu HashMap [secara konseptual]. ConcurrentHashMap dibagi menjadi banyak segmen [defaultnya adalah 16] saat diinisialisasi. ConcurrentHashMap sekitar (16) thread serupa mengakses segmen ini secara bersamaan, setiap thread berjalan secara bersamaan dengan konkurensi tinggi. Oleh karena itu, jika pasangan nilai kunci Anda disimpan di segmen 10, Anda tidak perlu mengunci 15 segmen sisanya. Struktur ini memberikan tingkat paralelisme yang sangat tinggi.

    Pertanyaan wawancara populer HashMap dan 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;
        }
    }

    Подробней об этом в следующей статье. Если вы нашли статью полезной пожалуйста поделитесь с друзьями! Счастливого обучения!

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