![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Royan |
|
||||||||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: 3 Всего: 15 |
Есть у данной исплементации Map конструктор со следующей сигнатурой: LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
Я решил поэкспериментировать, вот мои результаты:
Output:
Если к-то не заметил, то в случае когда параметр accessOrder выставлен в true, то всякий раз когда мы пользуемся итератором, последний элемент к которому произошло обращение при помощи LinkedHashMap#get(), LinkedHashMap#put() и LinkedHashMap#putAll() переходит в конец списка (в случае putAll() для каждого добавленного элемента). Объяснил коряво ну суть такая. Если accessOrder в true, и мы внутри цикла итерируем по LinkedHashMap, то всякий раз когда мы делаем вызов вышеописанных методов внутри нашего цикла, то следующий раз когда мы будем итерировать то начнем с того элемента который дернули последним. Именно поэтому в строке 26 авыводится 9, а не 0 (как было бы если бы accessOrder был выставлен в false) break'и в циклах стоят, дабы не спровоцировать ConcurrentModificationException, поскольку опять же обращение get(), put() и putAll() модифицирует внутреннюю структуру списка. Еще одно дополнение, вызовы get() должны быть последовательным поэтому если сразу дернуть, к примеру, 2-й элемент, то все будет работать в обычных условиях:
Output:
Все это я затеял с тем, чтобы понять зачем вообще весь этот огород было городить? В каких задачах нужна подобная функциональность? -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
||||||||
|
|||||||||
| Andy_L20066 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 10.3.2008 Репутация: нет Всего: 1 |
интересный вопрос.... ну могу сказать следующее:
если accessOrder у нас true и выполняется (Integer i : map.keySet()) тогда переменная 'i' будет постоянно отвечать за индекс первого елемента в мапе... то есть это может быть 9, как в первом случае... потому что этот елемент сейчас на первом месте в мапе... тоесть вернется елемент с ключем 9... или если во втором случае у нас был доступ сначала ко второму елементу(map.get(i+2)), потом map.get(i) вернуло 0... ну правильно... потому что второй елемент поместился в конец мапы.... а на первом месте сейчас елемент с ключем 0....если accessOrder у нас false - тогда (Integer i : map.keySet()) будет нулевой... и будет возвращатся елемент с ключем '0'... тоесть с тем какие елементы в даный момент возвращаются, на мой взгляд - все логично... думаю функциональность такая нужна для того чтобы можно было иметь копию мапы из точным порядком елементов... хотя черт его знает.... поправьте если может чьо не так изложил... |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Там же в доке достаточно ясно написано - для организации LRU кешей, списков и т.п. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Royan |
|
|||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: 3 Всего: 15 |
Окей возьмем к примеру LRU кэш. Например мне нужно вытащить из LinkedHashMap'а 5-ый элемент... это что же получается - для того, чтобы добраться до него я должен буду проитерировать по элементам с 1 по 4-ый, чтобы потом взять сверху 5-ый? Тогда теряется суть кэша. В какой-то одной стороне должны оказываться самые часто используемые элементы, в другой самые редко используемые, а тут я взял и перебрал все с 1 по 4 как будто они мне были нужны. -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Из Map никто не вытаскивает элементы по номеру, т.к. в общем случае (например при использовании HashMap) неизвестно что там будет под пятым номером. Элементы из Map вытаскиваются по ключу. Итератор по Map используется или для полного перебора всех элементов, или для перебора их в определенном порядке (SortedMap или LRU Map) который индивидуален для каждого типа Map. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Royan |
|
|||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: 3 Всего: 15 |
Проблема в том, что в LRU реализации LinkedHashMap невозможно проитерировать более одного элемента за раз, так как внутренняя структура карты меняется после каждого выхова метода get -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Возможно, просто надо использовать правильный итератор
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Royan |
|
||||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: 3 Всего: 15 |
Итератор заработал - эффект пропал, это я, конечно, не к тому, чтобы ты полез дебажить
Output:
-------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Клево придумано То что ты хочешь, реализуется так:
Есть такая штука ListIterator, вот он позволяет указывать с какого места начати итерацию, и позволяет итерировать как вперед, так и назад. Но существует, только для List. P.S. И не пиши new String(">" + i) это совершенно избыточный код, приводящий к созданию лишних объектов. Вполне достаточно ">" + i. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |