Колекції (Collections) в Java. Map

серпня
09
2012

Зміст

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
Рис 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

Напишіть перше повідомлення!

Ви повинні увійти під своїм аккаунтом щоб залишати коментарі