Коли використовувати HashMap через LinkedList або ArrayList і навпаки


82

У чому причина, чому ми не завжди можемо використовувати HashMap, хоча він набагато ефективніший за ArrayList або LinkedList при операціях додавання, видалення, незалежно від кількості елементів.

Я погуглив і знайшов деякі причини, але завжди було обхідне рішення щодо використання HashMap з перевагами, які все ще існують.


11
Listsі Mapsце дві абсолютно різні структури даних, з різними операціями та інваріантами. Чи можете ви пояснити контекст / вимоги, про які ви думаєте, де обидва варіанти будуть прийнятними рішеннями?
Марк Пітерс

3
Очевидно, вам ніколи не потрібно було тримати набір речей у певному порядку ...
Брайан Роуч

52
Чому проти? Я думаю, це правильне питання. Хоча це свідчить про відсутність знань, але щодо ТО питання не слід голосувати за відсутність знань. Насправді питання завжди є наслідком нестачі знань.

Відповіді:


96

Списки представляють послідовне впорядкування елементів. Карти використовуються для представлення колекції пар ключ / значення.

Незважаючи на те, що ви можете використовувати карту як список, у цього є певні мінуси.

Підтримання порядку: - Список за визначенням упорядкований. Ви додаєте елементи, після чого можете переглядати список у тому порядку, в якому ви вставляли елементи. Коли ви додаєте елементи до HashMap, ви не гарантуєте отримання елементів у тому самому порядку, в якому ви їх розмістили. Існують підкласи HashMap, такі як LinkedHashMap, які підтримуватимуть порядок, але загалом порядок не гарантується з картою.

Семантика ключ / значення: - Призначення карти - зберігати елементи на основі ключа, який можна використовувати для отримання елемента пізніше. Подібної функціональності можна досягти лише за допомогою списку в обмеженому випадку, коли ключовим випадком є ​​позиція у списку.

Читаність коду Розглянемо наступні приклади.

    // Adding to a List
    list.add(myObject);         // adds to the end of the list
    map.put(myKey, myObject);   // sure, you can do this, but what is myKey?
    map.put("1", myObject);     // you could use the position as a key but why?

    // Iterating through the items
    for (Object o : myList)           // nice and easy
    for (Object o : myMap.values())   // more code and the order is not guaranteed

Функціональність колекції Деякі чудові функції утиліти доступні для списків за допомогою класу Collections. Наприклад ...

    // Randomize the list
    Collections.shuffle(myList);

    // Sort the list
    Collections.sort(myList, myComparator);  

Сподіваюся, це допомагає,


LinkedLists часто називають поганими через проблеми з продуктивністю. Я часто використовую LinkedLists над ArrayLists через упорядкування елементів. Чи було б краще (для продуктивності та пам'яті), якби я використовував HashMaps з позиціями як клавіші?
Сезар Кастро,

33

Списки та Карти - це різні структури даних. Карти використовуються, коли ви хочете пов’язати ключ зі значенням, а Списки - це впорядкована колекція.

Map - це інтерфейс у Java Collection Framework, а HashMap - одна з реалізацій інтерфейсу Map. HashMap ефективні для пошуку значення на основі ключа та вставки та видалення значень на основі ключа. Записи HashMap не упорядковані.

ArrayList та LinkedList є реалізацією інтерфейсу List. LinkedList забезпечує послідовний доступ і, як правило, ефективніше вставляти та видаляти елементи у списку, проте він менш ефективний при доступі до елементів у списку. ArrayList забезпечує довільний доступ і ефективніше отримує доступ до елементів, але, як правило, повільніше вставляє та видаляє елементи.


1

Я наведу тут кілька реальних прикладів та сценаріїв, коли використовувати той чи інший варіант, це може бути корисно для когось іншого:

HashMap

Коли вам потрібно використовувати кеш у вашому додатку. Redis і membase - це деякий тип розширеної HashMap. (Не має значення порядок елементів, вам потрібен швидкий (O (1)) доступ до читання (значення), використовуючи ключ).

LinkedList

Коли порядок важливий (вони впорядковані так, як були додані до LinkedList), кількість елементів невідома (не витрачайте виділення пам’яті), і вам потрібен швидкий час вставки (O (1)). Хорошим прикладом є список справ, які можна перераховувати послідовно у міру їх додавання.


0

Падіння ArrayList та LinkedList полягає в тому, що при їх ітерації, залежно від алгоритму пошуку, час, необхідний для пошуку елемента, зростає із збільшенням розміру списку.

Краса хешування полягає в тому, що, хоча ви жертвуєте додатковим часом на пошук елемента, затрачений час не зростає із розміром карти. Це тому, що HashMap знаходить інформацію, перетворюючи елемент, який ви шукаєте, безпосередньо в індекс, щоб він міг здійснити перехід.

Коротко про історію ... LinkedList : споживає трохи більше пам'яті, ніж ArrayList, низька вартість для вставок (додавання та видалення) ArrayList : Споживає мало пам'яті, але схожа на LinkedList, і займає додатковий час для пошуку, коли вона велика. HashMap : може виконувати перехід до значення, роблячи час пошуку постійним для великих карт. Споживає більше пам'яті та займає більше часу, щоб знайти значення, ніж невеликі списки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.