Реализации интерфейса 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
Пожалуйста. Рад, что Вам нравятся!
Очень круто обьясняешь!Все понятно и доступно)
Это курсы в компании, где я работаю. Они проводились мной для сотрудников нашей компании. Отдельно я курсы нигде не провожу.
Конечно есть. Но в использовании этого метода есть много подводных камней, которые желательно знать. Почитайте статью на хабре habrahabr_ru_post_79913, а особенно комментарии.
Вкратце скажу так:
Пул строк, куда они добавляются после intern() хранится в области «Perm Gen», которая зарезервирована для non-user объектов JVM (классы и пр). Если это не учесть и для всех динамически вычитываемых строк использовать intern(), то вы можете получить OutOfMemory Error.
Я может что-то не понимаю, но когда создается simpleLRUCashe говорится, что так как у нас 11 элементов реально в мапе, и мы больше 11 до вызова метода removeEldestEntry иметь не можем, то коллизий не будет так как 11 мест и 11 элементов. Я не согласен. у нас коллизия может быть и в мапе размером 100 при двух элементах если у них будет одинаковый хешкод. Разве я не прав?
P.S. спасибо за уроки.
1) Простой тест можешь написать сам и проверить, что arrayCopy _обычно_ работает быстрее простого for. Если лень писать, смотри тут: goo.gl / WYaI4x
2) О том, что arrayCopy оптимизирован даже для различных типов, можешь почитать тут: goo.gl / 58Elq3
3) Посмотри исходники метода transfer в HashMap и постарайся понять, почему тут arrayCopy _не_ используется (подсказка - вызов indexFor).
4) Зачем нужна степень двойки в HashMap capacity почитай тут: goo.gl / 3ozCiS
В HashMap есть еще и другие интересные моменты реализации, о которых я также не рассказал. Например, почему поле внутренней таблицы объявлено как transient. Время не резиновое - обо всем не расскажешь, что-то ж ведь надо и самому почитать :)
про LRU cache и capacity + 1: так коллизия вроде как не связано с тем есть место в мапе или нет. в мапе может быть хоть 100 свободных ячеек, но все равно может произойти коллизия если hashCode одинаковый. поэтому эта имплементация никак не гарантирует что не будет коллизии.
Tkach насчет скорости добавления элементов в ArrList или в HashMap, в те моменты когда у нас заканчиваются бакеты, или элементы массива в Ar.List вызывается метод System.arraycopy для Ar.List а для Map Начальная емкость должна быть всегда степенью 2 а не 5. Если в конструктор передать не степень 2-ки, то устанавл-ся не эта неправильная емкость, а ближайшая степень 2, которая больше этого числа. Когда фактор загр-и превышен, автом-ки увеличивает свою емкость вдвое- тоже что и System.arraycopy
О каких 'элементах' идет речь при объяснении loadFactor - о количестве элементов в 'корзинах'?
Спасибо
Спасибо. Узнал много нового!
no podras venir a Paraguay a dar una conferencia?
спасибо, полезные лекции + приятно смотреть.
muchas gracias de todos modos, pero seguire asistiendo a traves de youtube, saludos
Когда написал System.gc() получил подсказку от eclipse "Don't try to be smarter than the JVM, remove this call to run the garbage collector." )))
не понял на 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
В конструктор HashMap можно передать и 5, и 25. Реальная емкость будет другой (из-за степени 2) - но это уже детали реализации. Суть это не меняет - при достижении определенного порога размер увеличится в 2 раза, и эта операция будет не быстрой, так как надо перераспределить элементы. И в HashMap увеличение размера проиходит дольше, чем в ArrayList - там не используется System.arrayCopy, как ты написал раньше.
Извини, но именно основ понимания в твоих высказываниях я не увидел, только много "!!"
Получается, simpleLRUCashe - при добавлении 11 элемента, если все 10 предыдущих уже были get(), то removeEldestEntry всегда будет удалять только что добавленный элемент. Или добавляемый элемент всегда последний ?
Спасибо за урок
Нет, не только что добавленный, а элемент, который реже всего использовался.
Я думаю, что удалит тот - к которому мы обращались первее всех. По принцыпу очереди. Тот к которому обращаемся идет в конец, а все смещаються в лево. Элементы удаляються с лева.
Юра читай внимательно!!! Цитирую "Ar.List вызывается метод System.arraycopy для Ar.List а для Map Начальная емкость..." где ты тут увидел что я сказал , о том что для HashMap-ы вызывается System.arraycopy?????
все работает и с таким конструктором super(capacity, 1.1f, true);
не понимаю зачем нада capacity+1
Не используйте циклы для ожидания, для этого есть Thread.sleep().
жаль что канал больше не работает
Кто сказал что распределение в хеш мапе нормальное? Все будет зависеть от хешкодов поступающих элементов. Все может выродиться в 1 корзину , если хешкод константа.
No, eso es demasiado lejos :)
@Override
protected boolean removeEldestEntry(Map.Entry<K, V>eldest)
Извини, не смог разобрать с первого раза. Постарайся писать грамотно, тогда тебя будет легче понять, и исчезнет двусмысленность в написанном.
Помнишь, как в классике: "Казнить нельзя помиловать" - запятые расставьте сами :)
Юра!! Ты не прав когда говоришь о конструкторе в который надо передать 5 или о том что копирование в Ar.List быстрее, чем в HashMap!! И это твои слова !!! Какая " микро-оптимизации, которую сделали разработчики HashMap"?? не разработчики а Джошуа Блох!!! Это друг не микро-оптимизация, а основы понимания работы коллекций!!!
чем докажешь , что System.arrayCopy работает быстрее, чем void resize(int newCapacity)... Твои слова , что ArrayList при увеличении массива работает быстрее?? вот и докажи . Даже авторы JAVA об этом факте умалчивают ... если ты занимался исследованиями поделись ... это лучше чем HashMap на 5 символов в int initialCapacity ))))
В Киеве
Не понятно объясняет(
Ты вообще тестер насколько я понимаю ... ну так и говори!!! а то 5!!! 5!!! откуда от сырости ?????? 4 или8!!!!! а не 5 и при превышении размера долго ждем переноса наших данных в новый в двое увеличенный контейнер хоть в ArrList хоть в HashMap... а вообще учи JAVA-у или хоть сарцы посмотри!!!!
HI PLZ UPLOAD IN ENGLISH
Кто сказал что распределение в хеш мапе нормальное? Все будет зависеть от хешкодов поступающих элементов. Все может выродиться в 1 корзину , если хешкод константа.