2015-07-29 3 views
5

Как я понимаю, LinkedHashMap расширяет HashMap и LinkedHashMap.Entry также расширяет HashMap.Entry.Понимание acessOrder LinkedHashMap Реализация в java

LinkedHashMap имеет две основные атрибуты 1) заголовка которое является LinkedHashMap.Entry узел. и 2) унаследовал таблицу, который HashMap.Entry [] массива. Теперь стол в LinkedHashMap присваивается массив LinkedHashMap.Entry во время выполнения, и это заботятся ниже способом:

/** 
    * This override differs from addEntry in that it doesn't resize the 
    * table or remove the eldest entry. 
    */ 
    void createEntry(int hash, K key, V value, int bucketIndex) { 
     HashMap.Entry<K,V> old = table[bucketIndex]; 
     Entry<K,V> e = new Entry<>(hash, key, value, old); 
     table[bucketIndex] = e; 
     e.addBefore(header); 
     size++; 
    } 

Первые три строки метода фактически преобразует HashMap .Entry до LinkedHashMap.Entry также содержит ссылки после и перед тем Входа в пути таким образом, что перед тем из заголовка указывает на последний элемент в порядке и в прошлом элемента после указывает на заголовок формирования круга.

Теперь, когда мы создаем экземпляр либо Карт (с помощью нового конструктора), память не выделяется для атрибута таблица, как его просто инициализируется пустой стол.

Map<String, String> linkedHashMap = new LinkedHashMap<String, String>(); 

Теперь давайте говорить, что мы делаем наши путы: -

linkedHashMap.put("a", "A"); 
linkedHashMap.put("b", "B"); 
linkedHashMap.put("c", "C"); 

После этих заявлений нашей структуры LinkedHashMap данные (таблицы массива инициализируются после того, как первый же) будет выглядеть как в ПОС . Я обозначил элементы a, b и c для удобства использования. Я понимаю, что реальный порядок не будет таким. Я считаю эту структуру данных довольно сложной, так много ссылок. Он имеет двойной связанный список, который поддерживается совершенно по-разному и для разных целей, а также для одиночного связанного списка для обычного хэш-карты, и это тоже в том же Входе. Правильно ли я понимаю?

enter image description here

ответ

0

Вы сделали несколько хороших копаться в коде, который отлично! Однако LinkedHashMap не такой сложный, как вы «хотите». На самом деле это очень простое расширение HashMap с единственной целью сохранения порядка, в который были добавлены элементы †.

Первые три строки метода фактически преобразует HashMap.Entry в LinkedHashMap.Entry, а также поддерживает ссылки о до и после Входа

Это правильно, LinkedHashMap. Запись расширяет HashMap.Entry, но добавляет бит, указав указатели на before и after.

HashMap

enter image description here

LinkedHashMap

enter image description here

Даже несмотря на то, LinkedHashMap схема выглядит намного более сложным, он просто добавляя before и after указатели, представленные синим/Красные стрелки.

LinkedHashMap также поддерживает порядок доступа (режим заказа), за исключением ввода-заказа в качестве аргумента конструктора. Если для флага установлено значение true, итерация по списку вернет элементы в том порядке, в котором они были доступны, а не в том порядке, в котором они были вставлены.

Фотографии с JavaArticles.

+0

Спасибо за ссылку JavaArticles. Это свидетельствует (хотя и на высоком уровне), что я сделал из проверки кода. И да, я не хочу, чтобы структура данных была сложной. Сначала я понял, что это сложно: и я считаю, что я не один в этом. – nanosoft