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

августа
09
2012

Содержание

Map не является реализацией интерфейса Collection, тем не менее, является частью фреймворка Collections.

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

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии