JavaRush /جاوا بلاگ /Random-UR /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. کلید کے لیے بے ترتیب/فکسڈ ہیش کوڈ() اقدار کا اثر
  8. ملٹی تھریڈ ایپلی کیشنز میں غیر مطابقت پذیر کوڈ میں HashMap کا استعمال
تو آئیے شروع کریں:
  1. ہیش میپ کے لیے کلید تیار کرنا

    اہم ضرورتوں میں سے ایک یہ ہے کہ ہمیں بغیر کسی غلطی کے آبجیکٹ کی قدر واپس کرنی چاہیے۔ ٹھیک ہے؟ بصورت دیگر، یہ واضح نہیں ہے کہ آپ جس ڈیٹا ڈھانچے کو ڈیزائن کر رہے ہیں اس کا تصور کیسے کریں۔ استعمال کرنا ناممکن ہو جائے گا۔ یہ فیصلہ کرنے کے لیے کہ ہم نے ایک اچھی کلید بنائی ہے ہمیں یہ جاننا ہوگا کہ HashMap کیسے کام کرتا ہے۔ HashMap ہیشنگ کے اصولوں پر بنایا گیا ہے۔ ہیش کوڈ میں کلید بنیادی طور پر ہیش میپ میں کسی عنصر کو شامل کرنے اور تلاش کرنے کے لیے equals() طریقہ کے ساتھ استعمال ہوتی ہے۔ اگر کسی چیز کے ہیش کوڈ کو دوسرے کلیدی قدر کے جوڑے میں تبدیل کر دیا جاتا ہے، تو نقشہ سے قدر حاصل کرنا تقریباً ناممکن ہے۔ اس معاملے کو میموری لیک کہا جاتا ہے۔ اس سے بچنے کے لیے، کلید اور نقشہ کو ناقابل تغیر ہونا چاہیے۔ یہ بنیادی وجہ ہے کہ غیر تبدیل شدہ کلاسز جیسے کہ String، Integer اور دیگر اسی طرح کی کلاسیں کلید بنانے کے لیے اچھے انتخاب ہیں۔

    لیکن یاد رکھیں کہ ناقابل تبدیلی کی سفارش کی جاتی ہے، لیکن اس کی ضرورت نہیں ہے۔ اگر آپ کسی تغیر پذیر آبجیکٹ کو کلید بنانا چاہتے ہیں، تو آپ کو یہ یقینی بنانا ہوگا کہ کلیدی آبجیکٹ آبجیکٹ کے ہیش کوڈ کو تبدیل نہ کرے۔ یہ hashCode() طریقہ کو اوور رائیڈ کر کے کیا جا سکتا ہے۔ مزید برآں، کلیدی کلاسوں کو ہیش کوڈ() اور برابر () طریقوں کے ساتھ صحیح طریقے سے کام کرنا چاہیے تاکہ عمل درآمد کے ناپسندیدہ اور حیران کن رویے سے بچا جا سکے۔

  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