Descuento de otoño
Universidad de Java
Aprendizaje
Cursos
Tareas
Cuestionarios y controles
Juegos
Ayuda
Horario para collejas
Becarios
Comunidad
Usuarios
Foro
Chat
Artículos
Casos de éxito
Actividades
Comentarios
Suscripciones
Tema claro
Artículo
  • Comentarios
  • Sobre nosotros
  • CS50
Comenzar
Empezar a aprender
  • Artículos
  • Autores
  • Todos los grupos
  • Lista de todos los artículos
JavaRush /Blog de Java /Random-ES /Preguntas populares de la entrevista sobre HashMap y Conc...
furs08
Nivel 11
  • 28 febrero 2021
  • 461 views
  • 0 comments

Preguntas populares de la entrevista sobre HashMap y ConcurrentHashMap

Publicado en el grupo Random-ES
Java-университет
En mi última vista previa, hablé sobre "Cómo funciona HashMap en Java ". Hablé sobre los aspectos internos de esta clase y cómo encajan en el concepto. Pero cuando me preguntaron sobre HashMap y cosas relacionadas, el interlocutor no se limitó solo al concepto básico. Durante la discusión se tocan diferentes direcciones, al final todo se reduce a si realmente entiendes estas cosas o no. Preguntas de entrevista populares de HashMap y ConcurrentHashMap - 1En esta vista previa, intentaré cubrir todos los temas principales de las preguntas de la entrevista: Temas cubiertos:
  1. ¿Cómo crear una clave para un HashMap?
  2. ¿Diferencias entre HashMap y ConcurrentHashMap?
  3. ¿Diferencias entre Collections.synchronizedMap (HashMap) y HashMap?
  4. ¿Diferencias entre ConcurrentHashMap y Collections.synchronizedMap (HashMap)?
  5. ¿Diferencias entre HashMap y HashTable?
  6. ¿Diferencias entre HashTable y Collections.synchronizedMap (HashMap)?
  7. Impacto de los valores hashCode() aleatorios/fijos para una clave
  8. Uso de HashMap en código no sincronizado en aplicaciones multiproceso
Entonces empecemos:
  1. Generando una clave para un HashMap

    Una de las principales necesidades es que debemos devolver el valor del objeto sin errores. ¿Bien? De lo contrario, no queda claro cómo imaginar la estructura de datos que está diseñando. Será imposible de usar. Para decidir que hemos creado una buena clave necesitamos saber cómo funciona un HashMap. HashMap se basa en los principios de Hashing. La clave en el código hash se usa principalmente en combinación con el método equals() para agregar y buscar un elemento en HashMap. Si el código hash de un objeto se cambia a otro par clave-valor, entonces es casi imposible obtener el valor del Mapa. Este caso se llama pérdida de memoria. Para evitar esto, la clave y el mapa deben ser inmutables. Esta es la razón principal por la que las clases inmutables como String, Integer y otras clases similares son buenas opciones para crear una clave.

    Pero recuerde que se recomienda la inmutabilidad, pero no es obligatoria. Si desea convertir un objeto mutable en la clave, debe asegurarse de que el objeto clave no cambie el código hash del objeto. Esto se puede hacer anulando el método hashCode(). Además, las clases clave deben funcionar correctamente con los métodos hashCode() y equals() para evitar comportamientos de ejecución sorprendentes y no deseados.

  2. Diferencias entre HashMap y ConcurrentHashMap

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

    Preguntas de entrevista populares de HashMap y ConcurrentHashMap - 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    — Да.

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

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

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

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

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

    Más sobre esto en el próximo artículo. Si el artículo te resultó útil, ¡compártelo con tus amigos! ¡Feliz aprendizaje!

Frontend-университет
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Aprender
  • Курси програмування
  • Registro
  • Curso de Java
  • Ayuda con las tareas
  • Precios
  • Proyectos de juegos
Comunidad
  • Usuarios
  • Artículos
  • Foro
  • Chat
  • Casos de éxito
  • Actividades
Empresa
  • Información sobre nosotros
  • Contactos
  • Comentarios
  • Preguntas frecuentes
  • Soporte
JavaRush JavaRush es un curso por Internet para aprender programación en Java desde cero. Este curso es la manera perfecta para que los principiantes dominen Java. Ofrece más de 1200 tareas con comprobación instantánea y contenidos teóricos esenciales sobre los fundamentos de Java. Para ayudarte a triunfar en tu formación, hemos implementado una serie de características motivadoras: controles, proyectos de programación y contenidos sobre aprendizaje eficiente y para tu carrera profesional como desarrollador Java.
Síguenos
Los programadores no nacen, se hacen © 2025 JavaRush
Descargar aplicación
  • Google Play
  • App Store
Mastercard Visa
Los programadores no nacen, se hacen © 2025 JavaRush