Зміст
Map не є реалізацією інтерфейсу Collection, тим не менш, є частиною фреймворка Collections. Map - об'єкт, який зберігає пари ключ-значення і не може містити ключів, що повторюються.
Map - об'єкт, який зберігає пари ключ-значення і не може містити ключів, що повторюються. При додаванні елемента за існуючим ключем відбувається запис нового елемента по ключу замість старого. Це демонструє наступний приклад:
Map<String, String> map = new HashMap<String, String>();
map.put("1", "a");
map.put("1", "2");
for( Entry<String, String> entry : map.entrySet() ){
System.out.println( entry.getKey() + " " + entry.getValue() );
}
// Output: 1 2
Інтерфейс Map надає три способи для доступу до даних: використовуючи Set з ключів (метод keySet), колекцію із значень (метод values) і Set з пари ключ-значення (метод entrySet). Порядок елементів у Map залежить від реалізації інтерфейсу. Інтерфейс Map.Entry, об'єкт якого повертає метод entrySet(), виглядає наступним чином:
public interface Entry {
K getKey();
V getValue();
V setValue(V value);
}
За допомогою методу setValue() інтерфейсу Entry надається можливість змінювати значення під час перебору елементів карти. Наприклад, так:
Map<String, String> map = new HashMap<String, String>();
map.put("1", "a");
map.put("2", "b");
map.put("3", "c");
for( Entry<String, String> entry : map.entrySet() )
if( "2".equals( entry.getKey() ) )
entry.setValue( "x" );
System.out.println( map );
// Output: {3=c, 2=x, 1=a}
Деякі карти мають обмеження на елементи і значення, які вони можуть містити. Наприклад, деякі реалізації забороняють використовувати null як ключ або значення. Наприклад, при спробі додати null-елемент в TreeMap генерується виключення NullPointerException. HashMap і LinkedHashMap дозволяють додавати null-елементи. При спробі додати null-значення в Map, який це не підтримує, необхідно генерувати NullPointerException або ClassCastException. Другий можливий варіант обробки заборонених значень - повернення методом false без генерування виключення.
Платформа Java версії 1.5 надає три класи загального використання, що реалізують інтерфейс Map: HashMap, TreeMap і LinkedHashMap. На Рис.1 наведено ієрархію цих класів.
Рис 1. Ієрархія Map у фреймворку Collections
Поведінка і швидкодія HashMap, TreeMap і LinkedHashMap є аналогами HashSet, TreeSet і LinkedHashSet відповідно:
Інтерфейс Map містить застарілу реалізацію Hashtable, яку не рекомендується використовувати. Деякі суттєві відмінності Map і Hashtable наведені нижче:
Map<String, String> map = new HashMap<String, String>();
map.put("1", "a");
map.put("2", "b");
map.put("3", "c");
for (Iterator<String> it = map.keySet().iterator(); it.hasNext(); )
if ( "2".equals( it.next() ) )
it.remove();
System.out.println( map );
// Output: {3=c, 1=a}
Нижче наведено кілька положень про Map, про які необхідно пам'ятати:
< | Колекції (Collections) в Java. Queue |