Java - різниця між hashmap, linkedhashmap і treemap, code q - a російська (ru)

Всі три класи реалізують інтерфейс Map і пропонують в основному ті ж функції. Найбільш важливою відмінністю є порядок, в якому відбувається ітерація через записи:

  • HashMap дає ніяких гарантій щодо порядку ітерацій. Він може (і буде) навіть повністю змінюватися при додаванні нових елементів.
  • TreeMap виконуватиме ітерацію відповідно до «природним порядком» ключів відповідно до методу compareTo () (або поставляється зовні Comparator). Крім того, він реалізує інтерфейс SortedMap. який містить методи, які залежать від цього порядку сортування.
  • LinkedHashMap виконуватиме ітерацію в тому порядку, в якому записи були поміщені в карту

«Hashtable» - це загальна назва для хеш-карт. В контексті Java API Hashtable є застарілим класом з часів Java 1.1 до того, як існувала структура колекцій. Його більше не слід використовувати, оскільки його API захаращений застарілими методами, які дублюють функціональні можливості, і його методи синхронізуються (що може знизити продуктивність і, як правило, марно). Використовуйте ConcurrrentHashMap замість Hashtable.

Я вважаю за краще візуальне уявлення:

Всі три є зіставлення від унікальних ключів до значень і, отже, реалізують інтерфейс Map.

HashMap - це карта, заснована на хешування ключів. Він підтримує операції O (1) get / put. Ключі повинні мати послідовні реалізації hashCode () і equals () щоб це працювало.

LinkedHashMap дуже схожий на HashMap, але він додає усвідомлення в порядок, за яким елементи додаються (або доступні), тому порядок ітерації збігається з порядком розміщення (або порядком доступу, в залежності від параметрів конструкції).

TreeMap - це відображення на основі дерева. Його операції put / get приймають час O (log n). Для цього потрібно, щоб елементи мали деякий механізм порівняння, або з порівнянням, або з компаратором. Порядок ітерацій визначається цим механізмом.

Просто ще один внесок від мого власного досвіду роботи з картами, коли я буду використовувати кожен з них:

  • HashMap - найбільш корисно при пошуку найкращого (швидкої) реалізації.
  • TreeMap (інтерфейс SortedMap) - найбільш корисно, коли я зацікавлений в тому, щоб сортувати або перебирати ключі в певному порядку, який я визначаю.
  • LinkedHashMap - об'єднує переваги гарантованого замовлення з TreeMap без збільшення вартості підтримки TreeMap. (Це майже так само швидко, як HashMap). Зокрема, LinkedHashMap також забезпечує відмінну відправну точку для створення об'єкта Cache, перевизначаючи метод removeEldestEntry (). Це дозволяє створити об'єкт Cache, який може спливати з використанням певних критеріїв.

Дивіться, де кожен клас знаходиться в ієрархії класів на наступній діаграмі (більший). TreeMap реалізує SortedMap і SortedMap а HashMap - немає.

HashTable застарів і повинен використовуватися відповідний клас ConcurrentHashMap.

  • Він має пари значень (ключі, значення)
  • НІ значень ключа дублювання
  • невпорядкований несортоване
  • Він допускає один нульовий ключ і більш ніж одне нульове значення

Хеш-таблиця

  • Так само, як хеш-карта
  • Він не дозволяє нульові ключі і нульові значення

LinkedHashMap

  • Це упорядкована версія реалізації карти
  • На основі пов'язаних списків і структур даних хеширования
  • Упорядкована і сортована версія
  • Засновані на хеш-структурах даних

HashMap абсолютно не гарантує порядок ітерації. Він може (і буде) навіть повністю змінюватися при додаванні нових елементів. TreeMap виконуватиме ітерацію відповідно до «природним порядком» ключів відповідно до методу compareTo () (або поставляється зовні компаратором). Крім того, він реалізує інтерфейс SortedMap, який містить методи, які залежать від цього порядку сортування. LinkedHashMap виконуватиме ітерацію в тому порядку, в якому записи були поміщені в карту

Подивіться, як змінюється продуктивність.

Карта дерева, яка представляє собою реалізацію сортувати карти. Складність операції put, get і containsKey - це O (log n) через природне упорядкування

@Amit: SortedMap - це інтерфейс, тоді як TreeMap - це клас, який реалізує інтерфейс SortedMap. Це означає, що якщо слід протокол, який SortedMap просить своїх виконавців зробити. Дерево, якщо воно не використовується як дерево пошуку, не може дати вам впорядковані дані, тому що дерево може бути будь-яким деревом. Тому, щоб змусити TreeMap працювати як Sorted order, він реалізує SortedMap (наприклад, Binary Search Tree - BST, збалансований BST, такий як AVL і дерево RB, навіть Tree Tree Tree), в основному використовується для ітеративних пошуків впорядкованим способом).

У NUT-SHELL HashMap. дає дані в O (1), без упорядкування

TreeMap. дає дані в O (log N), база 2. з впорядкованими ключами

LinkedHashMap. це таблиця Hash зі зв'язаним списком (думаю, проіндексована-SkipList) можливість зберігати дані так, як вони вставлені в дерево. Найкраще підходить для реалізації LRU (останнім часом використовується).

Дозвольте мені сказати просто:

  • HashMap реалізується як хеш-таблиця, і немає ніяких замовлень на ключі або значення.
  • TreeMap реалізується на основі червоно-чорної деревовидної структури і впорядковується ключем.
  • LinkedHashMap зберігає порядок вставки
  • Hashtable синхронізується, на відміну від HashMap. Він має накладні витрати для синхронізації. Саме тому HashMap слід використовувати, якщо програма є потокобезпечна.

Це різні реалізації одного і того ж інтерфейсу. Кожна реалізація має деякі переваги і деякі недоліки (швидка вставка, повільний пошук) або навпаки.

Всі три класи HashMap. TreeMap і LinkedHashMap реалізують інтерфейс java.util.Map і являють собою зіставлення від унікального ключа до значень.

HashMap містить значення, засновані на ключі.

Він містить тільки унікальні елементи.

Він може мати один нульовий ключ і кілька нульових значень.

public class HashMap extends AbstractMap implements Map, Cloneable, Serializable

  1. LinkedHashMap містить значення, засновані на ключі.
  2. Він містить тільки унікальні елементи.
  3. Він може мати один нульовий ключ і кілька нульових значень.

Це те ж саме, що HashMap натомість підтримує порядок вставки. // Див. Уповільнення класу нижче.

public class LinkedHashMap extends HashMap implements Map

  1. TreeMap містить значення, засновані на ключі. Він реалізує інтерфейс NavigableMap і розширює клас AbstractMap.
  2. Він містить тільки унікальні елементи.
  3. Він не може мати нульовий ключ, але може мати кілька нульових значень.

Це так само, як HashMap натомість підтримує висхідний порядок (товарів з використанням природного порядку його ключа.).

public class TreeMap extends AbstractMap implements NavigableMap, Cloneable, Serializable

  1. Hashtable - це масив списку. Кожен список відомий як відро. Положення відра ідентифікується викликом методу hashcode (). Hashtable містить значення, засновані на ключі.
  2. Він містить тільки унікальні елементи.
  3. Можливо, у нього немає нульового ключа або значення.
  4. Він синхронізований.

Це успадкований клас.

public class Hashtable extends Dictionary implements Map, Cloneable, Serializable

Всі пропонують карту key-> value і спосіб ітерації через клавіші. Найбільш важливою відмінністю між цими класами є гарантії часу і порядок ключів.

  1. HashMap пропонує 0 (1) пошук і вставку. Однак, якщо ви перебирає ключі, впорядкування ключів по суті довільно. Він реалізується масивом пов'язаних списків.
  2. TreeMap пропонує пошук O (log N) і вставку. Ключі впорядковані, тому, якщо вам потрібно перебирати ключі в відсортованому порядку, ви можете. Це означає, що ключі повинні реалізовувати інтерфейс Comparable. TreeMap реалізується червоно-чорним деревом.
  3. LinkedHashMap пропонує 0 (1) пошук і вставку. Ключі упорядковуються по порядку вставки. Він реалізується двусвязного відрами.

Уявіть, що ви передали порожній TreeMap, HashMap і LinkedHashMap в наступну функцію:

Результат для кожного буде виглядати наступним чином.

Для HashMap висновок був в моїх власних тестах, але це може бути будь-який порядок. При замовленні немає гарантії.
Treemap, результат був,
LinkedList, результат був,

HashMap
Може містити один нульовий ключ.

HashMap не підтримує порядок.

TreeMap не може містити нульовий ключ.

TreeMap підтримує висхідний порядок.

LinkedHashMap може використовуватися для підтримки порядку вставки, за яким ключі вставляються в Карту, або також може використовуватися для підтримки порядку доступу, за якими здійснюється доступ до ключів.

1) HashMap map = new HashMap ();

2) TreeMap map = new TreeMap ();

3) LinkedHashMap map = new LinkedHashMap ();