Реализации интерфейса Map - Collections #2 - Advanced Java

Поділитися
Вставка
  • Опубліковано 24 гру 2024
  • Интересные реализации интерфейса Map в Java: LinkedHashMap, EnumMap, WeakHashMap. Особенности их использования и настройки для обеспечения оптимальной работы и быстродействия.
    Дополнительная информация, а также домашнее задание:
    yuriytkach.blog...
    Мини-курс "Advanced Java -- Collections" посвящен детальному рассмотрению стандартных реализаций интерфейсов Java Collections Framework (hash maps, queues, sets), объясняет их особенности, способы применения и знакомит с некоторыми интересными свойствами, позволяющими повысить эффективность работы с коллекциями в программе, а также избежать возникновения скрытых багов. Вторая часть данного мини-курса знакомит с неблокирующими реализациями коллекций (non-blocking lists and sets, concurrent maps, blocking queues), объясняет разницу между ними, а также на практике показывает их плюсы и минусы, и возможное применение.
    Базовая теория по коллекциям в Java:
    • Урок 10 - Generics, Co...
    Практика по использованию коллекций:
    • Коллекции - Занятие 5 ...
    Все видео курса "Advanced Java - Collections":
    • Advanced Java - Collec...
    Общая информация о курсах Advanced Java:
    yuriytkach.blog...
    Подписаться на канал:
    www.youtube.com...
    Канал "Yuriy Tkach" - Уроки по программированию на Java: / ytkach

КОМЕНТАРІ •

  • @java-tkach
    @java-tkach  11 років тому +13

    Пожалуйста. Рад, что Вам нравятся!

  • @yuliaartemyeva5383
    @yuliaartemyeva5383 5 років тому +13

    Очень круто обьясняешь!Все понятно и доступно)

  • @java-tkach
    @java-tkach  11 років тому +10

    Это курсы в компании, где я работаю. Они проводились мной для сотрудников нашей компании. Отдельно я курсы нигде не провожу.

  • @java-tkach
    @java-tkach  11 років тому

    Конечно есть. Но в использовании этого метода есть много подводных камней, которые желательно знать. Почитайте статью на хабре habrahabr_ru_post_79913, а особенно комментарии.
    Вкратце скажу так:
    Пул строк, куда они добавляются после intern() хранится в области «Perm Gen», которая зарезервирована для non-user объектов JVM (классы и пр). Если это не учесть и для всех динамически вычитываемых строк использовать intern(), то вы можете получить OutOfMemory Error.

  • @НиколайТкачев-ъ6м
    @НиколайТкачев-ъ6м 10 років тому +7

    Я может что-то не понимаю, но когда создается simpleLRUCashe говорится, что так как у нас 11 элементов реально в мапе, и мы больше 11 до вызова метода removeEldestEntry иметь не можем, то коллизий не будет так как 11 мест и 11 элементов. Я не согласен. у нас коллизия может быть и в мапе размером 100 при двух элементах если у них будет одинаковый хешкод. Разве я не прав?
    P.S. спасибо за уроки.

  • @java-tkach
    @java-tkach  11 років тому +5

    1) Простой тест можешь написать сам и проверить, что arrayCopy _обычно_ работает быстрее простого for. Если лень писать, смотри тут: goo.gl / WYaI4x
    2) О том, что arrayCopy оптимизирован даже для различных типов, можешь почитать тут: goo.gl / 58Elq3
    3) Посмотри исходники метода transfer в HashMap и постарайся понять, почему тут arrayCopy _не_ используется (подсказка - вызов indexFor).
    4) Зачем нужна степень двойки в HashMap capacity почитай тут: goo.gl / 3ozCiS

  • @java-tkach
    @java-tkach  11 років тому +1

    В HashMap есть еще и другие интересные моменты реализации, о которых я также не рассказал. Например, почему поле внутренней таблицы объявлено как transient. Время не резиновое - обо всем не расскажешь, что-то ж ведь надо и самому почитать :)

  • @jackdanyal4329
    @jackdanyal4329 3 місяці тому

    про LRU cache и capacity + 1: так коллизия вроде как не связано с тем есть место в мапе или нет. в мапе может быть хоть 100 свободных ячеек, но все равно может произойти коллизия если hashCode одинаковый. поэтому эта имплементация никак не гарантирует что не будет коллизии.

  • @VASY1PUPKIN2
    @VASY1PUPKIN2 11 років тому

    Tkach насчет скорости добавления элементов в ArrList или в HashMap, в те моменты когда у нас заканчиваются бакеты, или элементы массива в Ar.List вызывается метод System.arraycopy для Ar.List а для Map Начальная емкость должна быть всегда степенью 2 а не 5. Если в конструктор передать не степень 2-ки, то устанавл-ся не эта неправильная емкость, а ближайшая степень 2, которая больше этого числа. Когда фактор загр-и превышен, автом-ки увеличивает свою емкость вдвое- тоже что и System.arraycopy

  • @hyperborean72
    @hyperborean72 6 років тому +1

    О каких 'элементах' идет речь при объяснении loadFactor - о количестве элементов в 'корзинах'?
    Спасибо

  • @barracudashark78
    @barracudashark78 3 роки тому

    Спасибо. Узнал много нового!

  • @DiegoManuelBenitezEnciso
    @DiegoManuelBenitezEnciso 11 років тому

    no podras venir a Paraguay a dar una conferencia?

  • @MikeHouse20101
    @MikeHouse20101 11 років тому

    спасибо, полезные лекции + приятно смотреть.

  • @DiegoManuelBenitezEnciso
    @DiegoManuelBenitezEnciso 11 років тому

    muchas gracias de todos modos, pero seguire asistiendo a traves de youtube, saludos

  • @sergeyplatoshin2412
    @sergeyplatoshin2412 5 років тому +1

    Когда написал System.gc() получил подсказку от eclipse "Don't try to be smarter than the JVM, remove this call to run the garbage collector." )))

  • @KyivanEnjoyer
    @KyivanEnjoyer 5 років тому

    не понял на 20:00 .
    пишу Map map = new SimpleLRUCache(2) и выделяет Integer, String (Type 'ua.tryhard.generic.collections.Map' does not have type parameters Alt+Shift+Enter Alt+Enter);
    С HashMap работает. Но и выводит в том примере 2=b, 3=c

  • @java-tkach
    @java-tkach  11 років тому +1

    В конструктор HashMap можно передать и 5, и 25. Реальная емкость будет другой (из-за степени 2) - но это уже детали реализации. Суть это не меняет - при достижении определенного порога размер увеличится в 2 раза, и эта операция будет не быстрой, так как надо перераспределить элементы. И в HashMap увеличение размера проиходит дольше, чем в ArrayList - там не используется System.arrayCopy, как ты написал раньше.
    Извини, но именно основ понимания в твоих высказываниях я не увидел, только много "!!"

  • @AHTOIIIKA
    @AHTOIIIKA 10 років тому

    Получается, simpleLRUCashe - при добавлении 11 элемента, если все 10 предыдущих уже были get(), то removeEldestEntry всегда будет удалять только что добавленный элемент. Или добавляемый элемент всегда последний ?
    Спасибо за урок

    • @java-tkach
      @java-tkach  10 років тому

      Нет, не только что добавленный, а элемент, который реже всего использовался.

    • @ЮраЧорнота
      @ЮраЧорнота 7 років тому

      Я думаю, что удалит тот - к которому мы обращались первее всех. По принцыпу очереди. Тот к которому обращаемся идет в конец, а все смещаються в лево. Элементы удаляються с лева.

  • @VASY1PUPKIN2
    @VASY1PUPKIN2 11 років тому

    Юра читай внимательно!!! Цитирую "Ar.List вызывается метод System.arraycopy для Ar.List а для Map Начальная емкость..." где ты тут увидел что я сказал , о том что для HashMap-ы вызывается System.arraycopy?????

  • @zyamii
    @zyamii 11 років тому

    все работает и с таким конструктором super(capacity, 1.1f, true);
    не понимаю зачем нада capacity+1

  • @w3stheimer
    @w3stheimer 5 років тому

    Не используйте циклы для ожидания, для этого есть Thread.sleep().

  • @funanimals898
    @funanimals898 3 роки тому

    жаль что канал больше не работает

  • @MrCosmicAlex
    @MrCosmicAlex 9 років тому +1

    Кто сказал что распределение в хеш мапе нормальное? Все будет зависеть от хешкодов поступающих элементов. Все может выродиться в 1 корзину , если хешкод константа.

  • @java-tkach
    @java-tkach  11 років тому

    No, eso es demasiado lejos :)

  • @isalnikov
    @isalnikov 11 років тому

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V>eldest)

  • @java-tkach
    @java-tkach  11 років тому

    Извини, не смог разобрать с первого раза. Постарайся писать грамотно, тогда тебя будет легче понять, и исчезнет двусмысленность в написанном.
    Помнишь, как в классике: "Казнить нельзя помиловать" - запятые расставьте сами :)

  • @VASY1PUPKIN2
    @VASY1PUPKIN2 11 років тому

    Юра!! Ты не прав когда говоришь о конструкторе в который надо передать 5 или о том что копирование в Ar.List быстрее, чем в HashMap!! И это твои слова !!! Какая " микро-оптимизации, которую сделали разработчики HashMap"?? не разработчики а Джошуа Блох!!! Это друг не микро-оптимизация, а основы понимания работы коллекций!!!

  • @VASY1PUPKIN2
    @VASY1PUPKIN2 11 років тому

    чем докажешь , что System.arrayCopy работает быстрее, чем void resize(int newCapacity)... Твои слова , что ArrayList при увеличении массива работает быстрее?? вот и докажи . Даже авторы JAVA об этом факте умалчивают ... если ты занимался исследованиями поделись ... это лучше чем HashMap на 5 символов в int initialCapacity ))))

  • @java-tkach
    @java-tkach  11 років тому

    В Киеве

  • @ladysoverschenstvo7875
    @ladysoverschenstvo7875 6 років тому +1

    Не понятно объясняет(

  • @VASY1PUPKIN2
    @VASY1PUPKIN2 11 років тому

    Ты вообще тестер насколько я понимаю ... ну так и говори!!! а то 5!!! 5!!! откуда от сырости ?????? 4 или8!!!!! а не 5 и при превышении размера долго ждем переноса наших данных в новый в двое увеличенный контейнер хоть в ArrList хоть в HashMap... а вообще учи JAVA-у или хоть сарцы посмотри!!!!

  • @prasantaroutray275
    @prasantaroutray275 11 років тому

    HI PLZ UPLOAD IN ENGLISH

  • @MrCosmicAlex
    @MrCosmicAlex 9 років тому

    Кто сказал что распределение в хеш мапе нормальное? Все будет зависеть от хешкодов поступающих элементов. Все может выродиться в 1 корзину , если хешкод константа.