JavaRush /جاوا بلاگ /Random-SD /HashMap ۽ ConcurrentHashMap مشهور انٽرويو سوال
furs08
سطح

HashMap ۽ ConcurrentHashMap مشهور انٽرويو سوال

گروپ ۾ شايع ٿيل
منهنجي آخري ڏيک ۾، مون بابت ڳالهايو "ڪيئن HashMap جاوا ۾ ڪم ڪري ٿو ". مون هن طبقي جي اندروني ڳالهين بابت ڳالهايو ۽ اهي تصور ۾ ڪيئن مناسب آهن. پر جڏهن مون کان پڇيو ويو 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 Hashing جي اصولن تي ٺهيل آهي. هيش ڪوڊ ۾ ڪيچي بنيادي طور تي استعمال ڪيو ويندو آهي برابر () طريقي سان ميلاپ ۾ شامل ڪرڻ ۽ HashMap ۾ هڪ عنصر ڳولڻ لاء. جيڪڏهن ڪنهن شئي جو هيش ڪوڊ تبديل ڪيو وڃي ته ٻي اهم-قدر واري جوڙي ۾، پوءِ نقشي مان قيمت حاصل ڪرڻ لڳ ڀڳ ناممڪن آهي. هن معاملي کي ميموري ليک سڏيو ويندو آهي. ھن کان بچڻ لاءِ، ڪنجي ۽ نقشي کي اڻ مٽ ھجڻ گھرجي. اهو ئي بنيادي سبب آهي ته غير بدليل طبقن جهڙوڪ 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